58

Я пытаюсь иметь меню опций в Фрагменты Android. ActionBar Меню параметров не отображается в моих фрагментах.Как добавить меню опций панели действий в Android Fragments

Вот мой код, и у меня есть и onCreateOptionsMenu(), и onOptionSelected() функция. Мой код не показывает никаких ошибок. Но меню параметров не отображается.

package org.reachout; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.LinearLayout; 

import org.general.R; 

public class ViewMessageFragment extends Fragment { 

    /* (non-Javadoc) 
    * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) 
    */ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     if (container == null) { 
      // We have different layouts, and in one of them this 
      // fragment's containing frame doesn't exist. The fragment 
      // may still be created from its saved state, but there is 
      // no reason to try to create its view hierarchy because it 
      // won't be displayed. Note this is not needed -- we could 
      // just run the code below, where we would create and return 
      // the view hierarchy; it would just never be used. 
      return null; 
     } 
     return (LinearLayout)inflater.inflate(R.layout.viewmessages_tab_fragment_layout, container, false); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     // TODO Auto-generated method stub 
     super.onCreateOptionsMenu(menu, inflater); 
     inflater.inflate(R.menu.askexperts_menu, menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // handle item selection 
     switch (item.getItemId()) { 
      case R.id.action_settings: 
      // do s.th. 
      return true; 
      default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

} 
+1

Это сработало для меня, я использовал setHasOptionsMenu (true); в onCreateView вместо onCreate.вызов setHasOptionsMenu (true); from onCreate решил мою проблему. – MTahir

+0

Это не имеет ничего общего с деятельностью, связанной с фрагментом? Я имею в виду, что никакой код не должен быть записан в активности для отображения меню. Только фрагмент должен быть прикреплен к действию. Пожалуйста, ответьте как можно скорее. –

ответ

81

Вам нужно позвонить setHasOptionsMenu(true) в onCreate().

Для обратной совместимости лучше разместить этот звонок как можно дольше в конце onCreate() или даже позже в onActivityCreated() или что-то в этом роде.

См: https://developer.android.com/reference/android/app/Fragment.html#setHasOptionsMenu(boolean)

+0

спасибо. Но у меня это работает в Android 4.0+. Но не по моей версии Android Gingerbread 2.3.3 и выше по какой-то причине. Я обновил свой код выше. Пожалуйста, помогите мне установить это в Android 2.3.3 и выше. –

+3

Переместите 'setHasOptionsMenu (true)' в конце 'onCreateView()'. Подобно 'View v = inflater.inflate(); setHasOptionsMenu (истина); return v; ' – flx

+0

Я пробовал, как вы сказали. Но все же его не отображается в Android Gingerbread. –

-17

в AndroidManifest.xml установить тему голо, как это:

<activity 
android:name="your Fragment or activity" 
android:label="@string/xxxxxx" 
android:theme="@android:style/Theme.Holo" > 

+0

фрагменты не объявляются в файле манифеста. –

+0

ОК. но этот код решает мою проблему – jhonnyjuncal

+5

Как именно это помогло бы? – SagePawan

68

Я опоздал на ответ, но я думаю, что это еще одно решение, которое здесь не упоминается, поэтому отправляю.

Шаг 1: Сделать XML из меню, которое вы хотите добавить, что я должен добавить действие фильтра на моей панели действий, так что я создал XML filter.xml. Основная строка, которую нужно отметить, - android: orderInCategory это покажет значок действия в первый или последний раз, где бы вы ни хотели показывать. Еще одна вещь, которую нужно отметить, - это значение, если значение меньше, чем оно будет отображаться вначале, а если значение больше, то оно показывается.

filter.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" > 


    <item 
     android:id="@+id/action_filter" 
     android:title="@string/filter" 
     android:orderInCategory="10" 
     android:icon="@drawable/filter" 
     app:showAsAction="ifRoom" /> 


</menu> 

Шаг 2: В OnCreate() метод фрагмента просто поместить строку ниже, как упоминалось, который отвечает за обратный вызов onCreateOptionsMenu (меню меню, MenuInflater inflater) метод как раз в Деятельность.

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

Шаг 3: Теперь добавьте метод onCreateOptionsMenu который будет переопределение как:

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     inflater.inflate(R.menu.filter, menu); // Use filter.xml from step 1 
    } 

Шаг 4: Теперь добавьте onOptionsItemSelected метод, с помощью которого можно реализовать логику независимо вы хотите сделать, когда вы выберите значок добавленного действия от actionBar:

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if(id == R.id.action_filter){ 
      //Do whatever you want to do 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
+0

Вы хотите сказать, что на шаге 3 надуть 'filter.xml'? Откуда появился «R.menu.search_result»? – brianestey

+0

Да, его 'filter.xml'. Изменено имя xml на шаге 3. – Pankaj

+0

Думал так много, но не хотел редактировать ваш ответ, не уточняя, поскольку я все еще медленно прорабатываю свои собственные проблемы. Спасибо за обновление. – brianestey

Смежные вопросы