web-dev-qa-db-ja.com

フラグメントのメニューが表示されない

最後の質問に役立つヒントがありました。今回も変わらないことを願っています:)まず、状況を説明しましょう。 2つのフラグメントを使用したアクティビティがあります。 xmlメニューレイアウトがあるフラグメントごとに、最初のメニューには4つのメニューエントリがあり、2番目のメニューには1つしかありません。これで、最初に4つのメニューエントリを持つフラグメントがロードされます。 onCreateメソッドで設定します

this.setHasOptionsMenu(true);

onCreateOptionsMenuメソッド

@Override 
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_fragshow, menu);
}

Xmlファイルは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:id="@+id/menu_refresh"
      Android:icon="@drawable/ic_action_search"
      Android:title="Refresh"
      Android:visible="true"
      Android:showAsAction="ifRoom|withText" />
<item Android:id="@+id/menu_clearall"
      Android:icon="@drawable/ic_action_search"
      Android:title="Clear"
      Android:visible="true"
      Android:showAsAction="ifRoom|withText" />
<item Android:id="@+id/menu_addcontent"
      Android:icon="@drawable/ic_action_search"
      Android:title="Add Content"
      Android:visible="true"
      Android:showAsAction="ifRoom|withText" />
<item Android:id="@+id/menu_newlist"
      Android:icon="@drawable/ic_action_search"
      Android:title="New List"
      Android:visible="true"
      Android:showAsAction="ifRoom|withText" />    
</menu>

これは正常に機能します。すべてのメニュー項目があり、クリックして応答できます。 「コンテンツの追加」メニューをクリックすると、他のフラグメントがロードされます。そこに私も設定

this.setHasOptionsMenu(true);

onCreateOptionsMenuメソッド

@Override 
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    Log.i("FragCreateList","onCreateOptionsMenu called");
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_fragcreatelist, menu);
}

Xmlファイル

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:id="@+id/menu_editdone"
      Android:icon="@drawable/ic_action_search"
      Android:title="Edit Done"
      Android:visible="true"
      Android:showAsAction="ifRoom|withText" />         
</menu>

しかし、新しいフラグメントでは、メニュー項目は表示されません。アクションバーでも、ハードウェアメニューボタンを押しても。前のフラグメントでは、2つのメニュー項目がアクションバーにあり、残りの2つはハードウェアボタンが押されたときに表示されました。しかし、ここでは何も表示されません。 onCreateOptionsMenuメソッドが呼び出されたというlogcatメッセージが表示されますが、何も起こりません。 (メニューが表示される直前に呼び出される(空の)onPrepareOptionsMenuメソッドへの呼び出しを取得しますが、まだ何もありません)何が間違っているのでしょうか? invalidateOptionsMenuを呼び出しても何も起こりません。それに、getActivity()。invalidateOptionsMenuとgetFragmentManager()。invalidateOptionsMenuがあるので、どちらを呼び出すべきか確かではありません...事前に感謝します。

編集:

<uses-sdk
    Android:minSdkVersion="14"
    Android:targetSdkVersion="15" />
43
El Duderino

OnCreateViewにsetHasOptionsMenu(true)を追加しましたが、正常に動作します

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    setHasOptionsMenu(true);
    return inflater.inflate(R.layout.my_example_fragment, container, false);

}
89
Amir Alagic

メニューを拡張する前にmenu.clear()を使用します。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();
    inflater.inflate(R.menu.mnulayout, menu);
}
52
Abhinaw Sharma

まず、フラグメントはonCreateになければなりません

    setHasOptionsMenu(true);

そして、アクティビティのDONTにNoActionBarのようなテーマがあることは少しトリッキーですが、アクティビティにそのテーマがある場合、setHasOptionsMenu(true)を呼び出す場所が問題にならないことを確認する必要があります

7
cubo1123

同じ問題がありました。アイテムでshowAsActionを使用して修正しましたmyAppコンテキストに適用

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" 
    xmlns:myapp="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/action_refresh"
          Android:icon="@drawable/ic_refresh"
          Android:title="refresh"
          Android:visible="true"
          myapp:showAsAction="ifRoom|withText"/>
</menu>

申し訳ありませんが、手遅れですが、他の人には役立つかもしれません。

7
aglour

これは実際に私のために機能し、同様にあなたの解決策になる可能性があります。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
    setHasOptionsMenu(true);
}
5
Cockpit Aliens

これは、デバイスにハードウェアメニューボタンがあるために発生します。したがって、変数「sHasPermanentMenuKey」の値は、ViewConfiguration hasPermanentMenuKey() でtrueです。リフレクションを使用して、この変数の値をfalseにする必要があります。例:

// this method force showing menu button in device with hardware menu button
private void showOverflowMenu(FragmentActivity activity) {
    try {
        ViewConfiguration config = ViewConfiguration.get(activity);
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if (menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

注:このメソッドは、フラグメントのメソッドonCreate()ではなく、アクティビティのonCreate()で使用します。

5
Orgazm pionerki

フラグメントでオプション/コンテキストメニューを登録する場合、通常はonActivityCreated()呼び出しまで待機して、メニューを関連付けるアクティビティがあることを確認する必要があります。ここで提案されている修正を試して、それが役立つかどうかを確認してください。

ListFragmentのコンテキストメニュー

3
jsmith

アクティビティを拡張する必要がありますActionBarActivity。アクティビティのみを拡張するものがある場合があります。strong text

0
ockley

アクティビティでToolbarを使用する場合は、必ずsetSupportActionBar(youtoolbar)を設定してください。

0
Michael Dovoh

フラグメントでonCreateOptionsMenuをonPrepareOptionsMenuに変更してみてください。同じ問題がありましたが、これが解決したことを覚えている限りは...

0
Dimanoid

メニューを表示するためのフラグメントクラスの場合は、onCreateView()メソッドまたはonCreateAcivity()メソッドのいずれかでsethasoptionsmenu(true)を追加します。ただし、onCreateView()メソッドに追加しました。それが誰かを助けることを願っています

0
ekenne chilex