繁体   English   中英

setOnClickListener for onOptionsItemSelected内部的按钮导致应用程序崩溃

[英]setOnClickListener for a button inside onOptionsItemSelected causing app crash

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

    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,实际上无法清楚地理解问题。 希望任何人都可以在这里帮助我。

我认为问题是因为您试图在实际显示视图之前先找到视图,这会导致在尝试分配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),并通过专门搜索该视图来定义在何处查找每个小部件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM