我正在onOptionsItemSelected()中创建一个EditText,并尝试在onClick()中获取它的信息。这是有问题的代码:
onOptionItemSelected(MenuItem item){
...
EditText mealCalories = new EditText(context);
mealCalories.setId(MealCalId) //in this example it's just an integer 1.
...
}
onclick(View v){
EditText mealCaloriesInBox = (EditText)findViewById(mealCalId);
}
当我没有从菜单中选择一个项目(因此没有调用onOptionItemSelected();)时,单击该按钮时它不会崩溃。但是,当我实际创建EditText并单击按钮时,它会在尝试创建实例时崩溃,从而给出上述错误。关于它为什么会这样做的任何想法?
修改
以下是我的更多代码:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Context context = getApplicationContext();
switch(item.getItemId()) {
case R.id.addMeal:
trackMealItems++;
mealCalId++;
mealFatId++;
mealCarbId++;
mealProteinId++;
//the base layout
LinearLayout root = (LinearLayout)findViewById(R.id.linearLayout1);
//make the layout that holds the meal item and add it to the base layout
LinearLayout mealItem = new LinearLayout(context);
mealItem.setId(trackMealItems);
mealItem.setOrientation(LinearLayout.VERTICAL);
mealItem.setLayoutParams(mealItemParams);
root.addView(mealItem);
//make the TextView that holds the name of the meal and add it to the mealItem layout
EditText mealName = new EditText(context);
mealName.setLayoutParams(mealNameParams);
mealItem.addView(mealName);
//make the TextViews that hold the information about the meal and stick them in a
//horizontal LinearLayout
LinearLayout mealStats = new LinearLayout(context);
mealStats.setOrientation(LinearLayout.HORIZONTAL);
mealStats.setLayoutParams(mealStatParams);
mealItem.addView(mealStats);
EditText mealCalories = new EditText(context);
mealCalories.setId(mealCalId);
mealCalories.setLayoutParams(mealStatParams);
mealStats.addView(mealCalories);
EditText mealFat = new EditText(context);
mealFat.setId(mealFatId);
mealFat.setLayoutParams(mealStatParams);
mealStats.addView(mealFat);
EditText mealCarbs = new EditText(context);
mealCarbs.setId(mealCarbId);
mealCarbs.setLayoutParams(mealStatParams);
mealStats.addView(mealCarbs);
EditText mealProtein = new EditText(context);
mealProtein.setId(mealProteinId);
mealProtein.setLayoutParams(mealStatParams);
mealStats.addView(mealProtein);
return true;
case R.id.removeMeal:
LinearLayout removeMe = (LinearLayout)findViewById(trackMealItems);
removeMe.setVisibility(View.GONE);
trackMealItems--;
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v){
EditText mealCaloriesInTextBox = (EditText)findViewById(mealCalId);
}
答案 0 :(得分:1)
您似乎在创建EditText时使用了两个不同的值:MealCalId
,在调用mealCalId
时使用findViewById
。这是一个可能的问题。另一个是,如果您有多个具有相同ID的视图,findViewById
将不一定返回您想要的视图。
修改强>
乍一看,您的代码看起来应该可以正常工作。我不知道出了什么问题,但我有一个解决办法的建议。创建视图时,不要为其指定ID,而是为其指定标记:
mealCalories.setTag(mealCalId);
(int
值将自动生成为Integer
。)然后在您的onClick处理程序中,按标记检索它:
EditText mealCaloriesInTextBox =
(EditText) getContentView().findViewWithTag(mealCalId);
如果与视图ID有任何有趣的交互,这种技术将避免它们。
如果这不起作用(或者如果您不喜欢),您还可以尝试使用Hierarchy Viewer诊断基于ID的检索。
答案 1 :(得分:1)
对于那些因为同样的原因而犯这个错误的人....
只需尝试清理项目并重新构建。
为我解决了。
答案 2 :(得分:0)
我试图运行你的代码,我发现的是那个
如果未单击菜单项并单击按钮,则编辑文本为空。
因此,如果您将对此对象调用任何方法,它将与NULLPointerException
一起崩溃单击菜单项然后单击按钮时,编辑文本不为空,因此您可以调用此对象上的任何方法。