最後の質問に役立つヒントがありました。今回も変わらないことを願っています:)まず、状況を説明しましょう。 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" />
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);
}
メニューを拡張する前にmenu.clear()を使用します。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.mnulayout, menu);
}
まず、フラグメントはonCreate
になければなりません
setHasOptionsMenu(true);
そして、アクティビティのDONTにNoActionBarのようなテーマがあることは少しトリッキーですが、アクティビティにそのテーマがある場合、setHasOptionsMenu(true)
を呼び出す場所が問題にならないことを確認する必要があります
同じ問題がありました。アイテムで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>
申し訳ありませんが、手遅れですが、他の人には役立つかもしれません。
これは実際に私のために機能し、同様にあなたの解決策になる可能性があります。
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}
これは、デバイスにハードウェアメニューボタンがあるために発生します。したがって、変数「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()で使用します。
フラグメントでオプション/コンテキストメニューを登録する場合、通常はonActivityCreated()呼び出しまで待機して、メニューを関連付けるアクティビティがあることを確認する必要があります。ここで提案されている修正を試して、それが役立つかどうかを確認してください。
アクティビティを拡張する必要がありますActionBarActivity。アクティビティのみを拡張するものがある場合があります。strong text
アクティビティでToolbar
を使用する場合は、必ずsetSupportActionBar(youtoolbar)
を設定してください。
フラグメントでonCreateOptionsMenuをonPrepareOptionsMenuに変更してみてください。同じ問題がありましたが、これが解決したことを覚えている限りは...
メニューを表示するためのフラグメントクラスの場合は、onCreateView()メソッドまたはonCreateAcivity()メソッドのいずれかでsethasoptionsmenu(true)を追加します。ただし、onCreateView()メソッドに追加しました。それが誰かを助けることを願っています