51

前回の質問に対してかなり役立つヒントが得られました。今回も変わらないことを願っています :) まず、状況を説明させてください。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" />
4

15 に答える 15

94

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);

}
于 2013-12-02T10:50:01.003 に答える
55

メニューを膨らませる前に menu.clear() を使用してください。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();
    inflater.inflate(R.menu.mnulayout, menu);
}
于 2012-09-20T20:40:38.553 に答える
8

私も同じ問題を抱えていました。myApp コンテキストに適用された項目で showAsAction を使用して修正しました。

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

申し訳ありませんが、あなたには遅すぎますが、他の人にとっては役立つかもしれません.

于 2013-10-14T13:40:58.053 に答える
7

これは実際に私にとってはうまくいき、あなたの解決策にもなる可能性があります.

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
    setHasOptionsMenu(true);
}
于 2015-10-05T12:13:28.903 に答える
6

これは、デバイスにハードウェア メニュー ボタンがあるために発生します。したがって、変数 "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() で使用してください。

于 2014-10-15T08:13:17.830 に答える
3

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

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

于 2012-08-23T12:13:23.393 に答える
1

オプション メニューは非表示になっている場合がありますが、機能します。これは、ハードウェア ボタンの [Recent Apps] を長押しすると確認できます。

上記の非表示メニューの理由に加えて、AndroidManifest.xml でアクション バーが指定されていないテーマが存在する場合があります。

    <application
        ...
        android:theme="@style/Theme.Design.NoActionBar"
        ...
    </application>
于 2019-12-02T08:02:27.807 に答える
0

断片的に onCreateOptionsMenu を onPrepareOptionsMenu に変更してみてください。私は同じ問題を抱えていました。覚えている限りでは、これで解決しました...

于 2012-08-23T11:27:27.467 に答える