Меню Android Options в фрагменте

Я пытаюсь добавить элемент в меню опций из группы фрагментов.

Я создал новый класс MenuFragment и расширил его для фрагментов, в которые я хочу включить элемент меню. Вот код:

 public class MenuFragment extends Fragment { MenuItem fav; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { fav = menu.add("add"); fav.setIcon(R.drawable.btn_star_big_off); } } 

По какой-то причине onCreateOptionsMenu не запускается.

Solutions Collecting From Web of "Меню Android Options в фрагменте"

Вызовите супер метод:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // TODO Add your menu entries here super.onCreateOptionsMenu(menu, inflater); } 

Поместите операторы журналов в код, чтобы узнать, не вызван ли метод или не изменяется ли в вашем коде код.

Также убедитесь, что вы вызываете SetHasOptionsMenu в onCreate чтобы уведомить фрагмент, что он должен участвовать в обработке меню параметров.

Если вы обнаружите, что onCreateOptionsMenu(Menu menu, MenuInflater inflater) не вызывается, убедитесь, что вы вызываете следующее из onCreate(Bundle savedInstanceState) :

 setHasOptionsMenu(true) 

У меня была та же проблема, но я думаю, что лучше подвести итоги и представить последний шаг, чтобы заставить ее работать:

  1. Добавьте метод setHasOptionsMenu (true) в методе onCreate(Bundle savedInstanceState) вашего фрагмента.

  2. Переопределите onCreateOptionsMenu(Menu menu, MenuInflater inflater) (если вы хотите сделать что-то другое в меню вашего фрагмента) и onOptionsItemSelected(MenuItem item) в своем фрагменте.

  3. Внутри вашего onOptionsItemSelected(MenuItem item) , убедитесь, что вы вернули значение false, когда действие элемента меню будет реализовано в onOptionsItemSelected(MenuItem item) Fragment.

Пример:

Мероприятия

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.activity_menu_item: // Do Activity menu item stuff here return true; case R.id.fragment_menu_item: // Not implemented here return false; default: break; } return false; } 

Фрагмент

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); .... } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Do something that differs the Activity's menu here super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.activity_menu_item: // Not implemented here return false; case R.id.fragment_menu_item: // Do Fragment menu item stuff here return true; default: break; } return false; } 

В моем случае мне понадобилось меню для обновления webview внутри определенного фрагмента, для которого я использовал:

Фрагмент :

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // TODO Add your menu entries here inflater.inflate(R.menu.menu, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.exit: System.exit(1); break; case R.id.refresh: webView.reload(); break; } return true; } 

Файл menu.xml

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/exit" android:title="Exit" android:icon="@drawable/ic_action_cancel" /> <item android:id="@+id/refresh" android:title="Refresh" android:icon="@drawable/ic_action_refresh" /> </menu> 

В menu.xml вы должны добавить все пункты меню. Затем вы можете скрыть объекты, которые вы не хотите видеть при начальной загрузке.

menu.xml

 <item android:id="@+id/action_newItem" android:icon="@drawable/action_newItem" android:showAsAction="never" android:visible="false" android:title="@string/action_newItem"/> 

Добавьте setHasOptionsMenu(true) в метод onCreate (), чтобы вызвать элементы меню в вашем классе фрагментов.

FragmentClass.java

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } 

Вам больше не нужно переопределять onCreateOptionsMenu в своем классе фрагментов. Элементы меню могут быть изменены (Add / remoev), переопределив onPrepareOptionsMenu доступный в Fragment.

 @Override public void onPrepareOptionsMenu(Menu menu) { menu.findItem(R.id.action_newItem).setVisible(true); super.onPrepareOptionsMenu(menu); } 

Перед раздуванием меню вам необходимо использовать menu.clear ().

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

а также

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } 

У меня была такая же проблема, мои фрагменты были страницами ViewPager. Причина, по которой это происходит, заключается в том, что при создании экземпляра FragmentPagerAdapter я использовал диспетчер дочерних фрагментов, а не менеджер фрагментов поддержки активности.

Если вы хотите добавить свое меню

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_custom, menu); } 

Файл меню:

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/play" android:titleCondensed="Speak" android:showAsAction="always" android:title="Speak" android:icon="@drawable/ic_play"> </item> <item android:id="@+id/pause" android:titleCondensed="Stop" android:title="Stop" android:showAsAction="always" android:icon="@drawable/ic_pause"> </item> </menu> 

Код мероприятия:

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.speak_menu_history, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.play: Toast.makeText(getApplicationContext(), "speaking....", Toast.LENGTH_LONG).show(); return false; case R.id.pause: Toast.makeText(getApplicationContext(), "stopping....", Toast.LENGTH_LONG).show(); return false; default: break; } return false; } 

Код фрагмента:

 @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.play: text = page.getText().toString(); speakOut(text); // Do Activity menu item stuff here return true; case R.id.pause: speakOf(); // Not implemented here return true; default: break; } return false; } 

Моя проблема была несколько иной. Я все сделал правильно. Но я наследовал неправильный класс для работы с размещением фрагмента.

Поэтому, чтобы быть ясными, если вы переопределяете onCreateOptionsMenu(Menu menu, MenuInflater inflater) в фрагменте, убедитесь, что ваш класс активности, который размещает этот фрагмент, наследует android.support.v7.app.ActionBarActivity (в случае, если вы хотите поддерживать ниже API Уровень 11).

Я наследовал android.support.v4.app.FragmentActivity для поддержки уровня API ниже 11.

Одна вещь, которую я бы добавил к этому, и причина, по которой она не работала для меня.

Это похоже на ответ Напстера.

  1. Убедитесь, что хостинговая деятельность вашего фрагмента расширяет AppCompatActivity , а не FragmentActivity !

     public class MainActivity extends AppCompatActivity { } 

    Из справочной документации Google для FragmentActivity:

    Примечание. Если вы хотите реализовать действие, включающее панель действий, вместо этого вы должны использовать класс ActionBarActivity, который является подклассом этого, поэтому вы можете использовать API-интерфейсы Fragment на уровне API 7 и выше.

  2. Чтобы обновить ответ Napster – ActionBarActivity теперь устарела, вместо этого используйте AppCompatActivity .

  3. При использовании AppCompatActivity также убедитесь, что вы задали тему действия Theme.AppCompat или аналогичную тему (Google Doc).

Примечание. android.support.v7.app.AppCompatActivity является подклассом класса android.support.v4.app.FragmentActivity (см. AppCompatActivity ref doc).

В папке вашего меню создайте XML-файл .menu и добавьте этот xml

 <item android:id="@+id/action_search" android:icon="@android:drawable/ic_menu_search" android:title="@string/action_search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="always|collapseActionView" /> 

В вашем классе фрагмента рассмотрим этот метод и

 implement SearchView.OnQueryTextListener in your fragment class @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setHasOptionsMenu(true); } 

Теперь просто настройте свой XML-файл меню в классе фрагментов

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_main, menu); final MenuItem item = menu.findItem(R.id.action_search); final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item); MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionCollapse(MenuItem item) { // Do something when collapsed return true; // Return true to collapse action view } @Override public boolean onMenuItemActionExpand(MenuItem item) { // Do something when expanded return true; // Return true to expand action view } }); } 

Настройка меню параметров после создания фрагмента хорошо работала для меня.

 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); } 

Если все вышеописанное не работает, вам нужно отладить и убедиться, что функция onCreateOptionsMenu была вызвана (путем размещения журнала отладки или записи …)

Если он не запущен, может быть, ваша тема для Android не поддерживает панель действий. Откройте AndroidManifest.xml и установите значение для android:theme с панелью поддержки темы :

  <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/Theme.AppCompat"> 

На ваш метод onCreate добавьте setHasOptionMenu ()

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } 

Затем переопределите ваш onCreateOptionsMenu

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.add("Menu item") .setIcon(android.R.drawable.ic_delete) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); }