我从菜单项目对话框调用,我在该对话框中有一个按钮,当我按下按钮时尝试做某事。我的代码部分如下:
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,实际上可能无法清楚地理解问题。希望有人可以帮助我。
答案 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)并通过专门搜索该视图来定义查找每个窗口小部件的位置。