2011-12-29 4 views
1

私はonOptionsItemSelected()にEditTextを作成し、その情報をonClick()に取得しようとしています。ここでは、問題のコードは次のとおりです。エラーの問題:android.widget.LinearLayoutをandroid.widget.EditTextにキャストすることはできません。

私はメニューから項目を選択していない
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を作成してボタンをクリックすると、インスタンスを作成しようとするとクラッシュし、前述のエラーが表示されます。それがなぜそれを行うことができるのかについてのアイデアはありますか?

EDIT

は、ここに私のコードの多くはである:あなたがfindViewByIdを呼び出すときに、あなたのEditTextを作成するときにMealCalIdmealCalId

@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

'onOptionItemSelected'で' mealCalories'を作成した後、それを既に画面上の他のビューの1つに追加していますか? –

+0

うん。これは、水平方向のLinearLayoutの内側にあります。 –

+0

LinearLayoutをEditTextにキャストできないというエラーがある場合、LinearLayoutはEditTextと同じIDを持ちますか? –

答えて

1

あなたは、2つの異なる値を使用しているように見えます。それが1つの可能な問題です。もう1つは、同じIDを持つ複数のビューがある場合、findViewByIdは必ずしも必要なものを返すとは限りません。一見

EDIT

それが動作するはずのように、あなたのコードが見えます。何がうまくいかないのか分かりませんが、回避策を提案しています。

mealCalories.setTag(mealCalId); 

int値がIntegerにautoboxedされます。)次に、あなたのonClickハンドラでは、タグによってそれを取得:

あなたの代わりにそれにIDを割り当てるので、ビューを作成すると、それにタグを割り当てます
EditText mealCaloriesInTextBox = 
    (EditText) getContentView().findViewWithTag(mealCalId); 

ビューIDと面白いやりとりがある場合、この手法では回避できます。

これがうまくいかない場合(または、とにかくお望みなら)、Hierarchy Viewerを使用してIDベースの検索を試みることもできます。

+0

ああ、2つの異なる変数は私の間違いでした。彼らは両方とも '食事カルデ'です。事は、そのidの唯一のビューです(実際は1です)。別の機能で同じビューを使用したいので、私は新しい 'EditText'を作成し、元の 'mealCalories'に対応させる必要があります。同様に、私は 'onClickItemSelected'で作成した 'mealCalories'テキストボックスを 'onClick'に使用したいと思います。 –

+0

@ hugo.torres私は、ビュー階層に 'mealCalories'を追加するコードを含め、より多くのコードを投稿した場合に役立つと思います。 –

+0

@ hugo.torres - 私は自分の答えを更新しました。 –

0

私はあなたのコードを実行しようとしましたが、私は何を発見したメニュー項目がクリックされていないと、ボタンがクリックされたとき

、エディットテキストがnullであるということです。あなたはこのオブジェクト上の任意のメソッドを呼び出す場合

だから、それは、メニュー項目がクリックされた後、ボタンをクリックすると、あなたがこのオブジェクト上の任意のメソッドを呼び出すので、エディットテキストがnullでない場合NullPointerException

でクラッシュします。私は同じ理由で、このエラーを持っている人のために

1

....

はちょうどあなたのプロジェクトと再構築を掃除してみてください。

私のために解決しました。

関連する問題