Intereting Posts
Извещения: AlertDialog без пользовательского интерфейса Выполнить код в основном потоке в Android без доступа к активности? Строительство проекта Android Studio на Jenkins? Android.compileSdkVersion отсутствует Как я могу установить цвет штриховой шкалы андроидов? (Не цвет звезд, а ГРАНИЦА) Обнаружение типа Android Wear – Round or Square Как программно установить редактируемый true / false EditText в Android? Как я могу получить код ответа из VolleyError? Вы не приняли лицензионные соглашения следующих компонентов SDK Проект библиотеки Android com.android.dex.DexException: несколько файлов dex определяют Lcom / google / gson / JsonSerializer Tel link android не работает (Galaxy S5) Получение случайного цвета с использованием случайного класса? Частично выбранный флажок на Android? Как запросить у поставщика MEDIA опцию «group by»? Обнаруживать, если буферизация видеоизображения Вставьте отметку времени в базу данных через ContentValues

Меню в Фрагментах, не показывающих

Я получил очень полезные подсказки к моим последним вопросам, надеюсь, на этот раз все будет не так. Во-первых, позвольте мне объяснить ситуацию. У меня есть активность с двумя фрагментами. Для каждого фрагмента у меня есть макет меню xml, первый имеет четыре записи меню, второй – только один. Теперь сначала загружается фрагмент с четырьмя пунктами меню. В методе 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> 

Но в новом фрагменте я не вижу никаких пунктов меню. Ни в панели действий, ни при нажатии кнопки аппаратного меню. В предыдущем фрагменте в панели действий находились два пункта меню, остальные два – при нажатии на кнопку аппаратного обеспечения. Но здесь ничего не показано. Я получаю сообщение logcat, которое вызвал метод onCreateOptionsMenu, но ничего не происходит. (Я даже получаю звонок к моему (пустому) методу onPrepareOptionsMenu, который следует вызывать прямо перед отображением меню, все еще ничего). Можно ли понять, что может быть неправильным? Вызов invalidateOptionsMenu не делает ничего. Кроме того, я точно не знаю, какой из них вызывать, поскольку есть getActivity (). InvalidateOptionsMenu и getFragmentManager (). InvalidateOptionsMenu … Спасибо заранее.

Редактировать :

 <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="15" /> 

Solutions Collecting From Web of "Меню в Фрагментах, не показывающих"

Я добавил setHasOptionsMenu (true) в onCreateView, и он отлично работает

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

У меня такая же проблема. Я исправил его, используя 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> 

К сожалению, для вас уже слишком поздно, но это может быть полезно для других людей.

Это происходит потому, что у вашего устройства есть кнопка меню оборудования. Поэтому значение переменной «sHasPermanentMenuKey» истинно в ViewConfiguration hasPermanentMenuKey () . Вы должны поместить значение этой переменной 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 () фрагмента.

Это действительно работает для меня и может быть вашим решением.

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

При регистрации для опций / контекстных меню в фрагментах вам обычно нужно дождаться вызова onActivityCreated (), чтобы убедиться, что есть активность для привязки меню. Попробуйте исправить это предложение и посмотрите, помогает ли это:

Контекстное меню из списка

Попытайтесь изменить onCreateOptionsMenu на onPrepareOptionsMenu в фрагментах, у меня была такая же проблема, и насколько я помню, это разрешило это для меня …

Ваша деятельность должна расширить ActionBarActivity . У вас может быть один, который только продлевает действие. Сильный текст

Для класса фрагмента, чтобы вы могли видеть свое меню, добавьте sethasoptionsmenu (true) в метод onCreateView () или onCreateAcivity (). Но я добавил мой метод onCreateView (). Надеюсь, это поможет кому-то

Очень поздно, поскольку ни одно из вышеперечисленных предложений не решило мою проблему. У моего устройства (2.3.5) была такая плохая проблема времени с меню опций, что мне пришлось идти по другому маршруту и ​​создать меню в части onprepare, используя надуватель от активности:

 @Override public void onPrepareOptionsMenu(Menu menu) { if (Build.VERSION.SDK_INT < 11) { menu.clear(); getActivity().getMenuInflater().inflate(R.menu.message_thread, menu); }