2

このトピックは他のトピックと似ているように見えますが、この場合に役立つ答えは見つかりませんでした。

これが私が欲しいものです:私はメニューのあるタブを持ってい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が返されます(確認しましたが、これらはViews2番目のタブのIDです!!)が、スイッチ/ケースを入力するために返される値です。それぞれ21311652152131165216であるため、前に述べたように、アイテムIDに問題があります。メニューの値は常に現在のアクティビティのインスタンスであるActivityため、最初のタブのメニューを使用してこのテストを行いました。ただし、メニューを含むコンテキストとアクティビティは同じですが、それでも機能しません。mContext

4

1 に答える 1

0

それで !私はついに何が悪かったのかを理解しました。ビルド/コンパイルエラーでした。プロジェクトを更新する前に何度も試しましたが、それだけでは不十分で、R.javaファイル(XMLファイルからID番号をコンパイルしている場所)も削除しようとしましたが、それでも機能しませんでした。Project -> Clear...そして、別のプロジェクトで作業しているときに、ついにEclipseの関数について思い出しました。

そしてそれはうまくいった。ですから、それは非常に難しいことではありませんでしたが、少なくとも今日、私は何か価値のあることを学びました。

于 2012-03-28T11:22:58.750 に答える