[英]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.