Подтвердить что ты не робот

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

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

Ответ 1

Я добавил 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);

}

Ответ 2

Используйте menu.clear() перед тем, как раздувать меню.

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

Ответ 3

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

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

Ответ 4

прежде всего ваш фрагмент должен иметь в onCreate

    setHasOptionsMenu(true);

а затем вы должны проверить, что ваша деятельность DONT имеет тему NoActionBar его немного сложно, но если ваша деятельность имеет эту тему, не имеет значения, где вы называете setHasOptionsMenu(true), фрагмент не будет рисовать ее

Ответ 5

Это происходит потому, что на вашем устройстве есть аппаратная кнопка меню. Поэтому значение переменной "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() фрагмента.

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

Убедитесь, что вы установили setSupportActionBar(youtoolbar), если вы используете Toolbar в своей деятельности.

Ответ 12

Очень поздно, поскольку ни одно из вышеперечисленных предложений не решило мою проблему. У моего устройства (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);
    }