0

我正在从菜单项调用对话框,并且在该对话框中有一个按钮,并在按下按钮时尝试执行某些操作。我的代码部分如下:

    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,它可以正常工作并完美显示对话框。但是每当我尝试使用监听器时,它就会崩溃。我检查了 LogCat,实际上并不能清楚地理解这个问题。希望任何人都可以在这里帮助我。

4

1 回答 1

0

我认为问题在于您在实际显示视图之前尝试查找视图,这会导致在尝试分配 onClickListener 时“计算”为空,从而引发空指针异常。

更详细地解释一下,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)并通过专门搜索该视图来定义在哪里找到每个小部件。

于 2013-07-08T04:33:53.957 回答