setOnClickListener用于onOptionsItemSelected内的按钮,导致应用程序崩溃

时间:2013-07-08 02:53:14

标签: android dialog onclicklistener onitemclicklistener

我从菜单项目对话框调用,我在该对话框中有一个按钮,当我按下按钮时尝试做某事。我的代码部分如下:

    public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.itTip:
        final Dialog tipCalculator = new Dialog(this);
        tipCalculator.setTitle("Tip Calculator");
        tipCalculator.setContentView(R.layout.tip_layout);

        totalBill = (EditText) findViewById(R.id.editTBill);
        tips = (EditText) findViewById(R.id.editTTip);
        calculate = (Button) findViewById(R.id.bCalcTip);
        tvResult = (TextView) findViewById(R.id.tvTipResult);

        calculate.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "Calculate clicked", Toast.LENGTH_SHORT).show();
            }
        });

        tipCalculator.setCancelable(true);
        tipCalculator.show();
        break;

    }
    return super.onOptionsItemSelected(item);
}

当我运行我的应用程序时,没有setOnClickListener,它工作正常并完美显示Dialog。但每当我尝试使用Listener时,它都会崩溃。我检查了LogCat,实际上可能无法清楚地理解问题。希望有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

我认为问题是因为您在实际显示之前尝试查找视图,这会在尝试分配onClickListener时导致'calculate'为null,从而抛出空指针异常。

为了更详细地解释,findViewById搜索当前正在显示的所有视图,并返回与该id匹配的视图。该按钮包含在R.layout.tip_layout中,但该视图在调用tipCalculator.show()之前不会膨胀,并且它不会包含在搜索的视图列表中,因此findViewById将返回null。

您可以采取一些方法来完成这项工作,但我认为以下内容需要对原始代码进行最少的更改:

case R.id.itTip:
    final Dialog tipCalculator = new Dialog(this);
    tipCalculator.setTitle("Tip Calculator");
    View contentView = View.inflate(this, R.layout.tip_layout, null);

    totalBill = (EditText) contentView.findViewById(R.id.editTBill);
    tips = (EditText) contentView.findViewById(R.id.editTTip);
    calculate = (Button) contentView.findViewById(R.id.bCalcTip);
    tvResult = (TextView) contentView.findViewById(R.id.tvTipResult);

    calculate.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(getApplicationContext(), "Calculate clicked", Toast.LENGTH_SHORT).show();
        }
    });

    tipCalculator.setContentView(contentView);
    tipCalculator.setCancelable(true);
    tipCalculator.show();
    break;

我们所做的不同是提前夸大视图(contentView)并通过专门搜索该视图来定义查找每个窗口小部件的位置。