このトピックは他のトピックと似ているように見えますが、この場合に役立つ答えは見つかりませんでした。
これが私が欲しいものです:私はメニューのあるタブを持っていTabActivity
ます。メニューのないタブが含まれています。メニューボタンを押すと、既存のメニューだけが表示されます。メニューを膨らませるだけなら、これはうまくいきます。しかし、メニューの内容を変更したい場合(onPrepareOptionsMenu(menu)
メソッド内の項目の表示を変更したい場合)、またはメニューの項目を押した場合でも、何も機能しません。
の場合onPrepareOptionsMenu(menu)
、問題はmenu.findItem(...)
nullオブジェクトを返すメソッドに起因しているようNullPointerException
です。ではonOptionsItemSelected(item)
、どのアイテムIDも認識されません。
メニューのコンテキストが現在のタブのアクティビティであることにデバッガーで気付いたので、代わりにそのアクティビティ内にメニューを移動しましたが、それ以上の成功はありませんでした。
最後に、以前のバージョンのアプリで同じメニューと非常によく似たコードを使用し、単一のアクティビティ(タブなし)を使用していましたが、問題は発生しませんでした。TabActivityデザインに移動したとき、最初は正常に機能していましたが(おそらく、メニューのコンテキストはタブTabActivity
の代わりに私のActivity
ものでした)、タブのアクティビティに小さな変更を加えた後は機能しなくなりました(メニュー)。
(およびサポートパッケージを)使用することでこれが修正されると思われる場合はActionBar
、後で移行する予定ですが、最初にこれを理解して修正したいと思います。
コードは次のとおりです。
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
MenuItem connect1 = menu.findItem(R.id.connect_1);
MenuItem connect2 = menu.findItem(R.id.connect_2);
// Here I do some stuff to prepare the menu, which could be simplified
// like this :
if (device1Connected)
if (!connect1.isVisible()) // here I get the NullPointerException
connect1.setVisible(true);
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// Handle item selection
switch (item.getItemId()) {
case R.id.select_device:
// do some stuff
return true;
case R.id.connect_1:
// do some stuff
return true;
case R.id.connect_2:
// do some stuff
return true;
case R.id.disconnect:
// do some stuff
return true;
default:
return super.onOptionsItemSelected(item);
}
}
これがメニューのXMLファイルです。特別なことは何もありません。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/select_device"
android:icon="@drawable/icon"
android:title="@string/choose_devices"/>
<item android:id="@+id/connect_1"
android:icon="@android:drawable/ic_menu_add"
android:title="@string/connect_1" />
<item android:id="@+id/connect_2"
android:icon="@android:drawable/ic_menu_add"
android:title="@string/connect_2" />
<item android:id="@+id/disconnect"
android:icon="@android:drawable/ic_menu_close_clear_cancel"
android:title="@string/disconnect" />
</menu>
編集:onPrepareOptionsMenu(menu)
NullPointerExceptionを回避するために、に以下を追加しました。実際の問題は解決しませんが、クリックするとどうなるかを正確に確認できます。MenuItem
if (connect1 == null || connect2 == null)
return super.onPrepareOptionsMenu(menu);
最初の項目をクリックすると、getItemId()
たとえば2131165207が返され、2番目の項目は2131165208が返されます(確認しましたが、これらはViews
2番目のタブのIDです!!)が、スイッチ/ケースを入力するために返される値です。それぞれ2131165215と2131165216であるため、前に述べたように、アイテムIDに問題があります。メニューの値は常に現在のアクティビティのインスタンスであるActivity
ため、最初のタブのメニューを使用してこのテストを行いました。ただし、メニューを含むコンテキストとアクティビティは同じですが、それでも機能しません。mContext