错误问题:android.widget.LinearLayout无法强制转换为android.widget.EditText

时间:2011-12-29 22:24:06

标签: java android android-layout android-widget

我正在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);
}

3 个答案:

答案 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

一起崩溃

单击菜单项然后单击按钮时,编辑文本不为空,因此您可以调用此对象上的任何方法。