9

я видел несколько сообщений о вопросах, где openOptionsMenu() не будет работать на разных версиях Android, например:openOptionsMenu() не будет работать AppCompat-v7 22.1.0 или более поздняя версия

openOptionsMenu() across android versions

openOptionsMenu() not working

но проблема, которая, как мне кажется, связана с версией используемой библиотеки поддержки appcompat-v7.

В сущности, с новыми версиями AppCompat-v7 меню появится хорошо, когда openOptionsMenu() вызывается, если ваша деятельность распространяется активность но не будет работать, если вы расширяете ActionBarActivity или AppCompatActivity (т.е. использовать библиотеку совместимости). В более старых версиях appcompat-v7 он отлично работает.

Это воспроизводимым, следующим образом:

  1. В Android Studio, Import Sample 'ActionBarCompat-Basic'
  2. Добавить кнопку на экране, которая вызывает openOptionsMenu()
  3. Обратите внимание, что это отлично работает, поскольку в образце используется старая версия библиотеки appcompat-v7: 21.0.3.
  4. Измените зависимость для использования appcompat-v7: 23.0.1, перестройте, а при нажатии на кнопку меню будет не.
  5. Изменение основной деятельности продлить активность (т.е. не приложение совместимости) - это работает
  6. Изменение основной деятельности для расширения AppCompatActivity (т.е. с использованием libarry совместимости приложений) - он не

После некоторого тестирования я «Мы обнаружили, что это перестало работать в appcompat-v7: 22.1.0 и больше не будет работать ни в одной новой версии этой банки.

Это поведение идентично на эмуляторе и на физическом устройстве, а также на версиях 5.1.1 (23) и 2.1 (7) Android, которые были двумя версиями, с которыми я тестировал.

Я добавил комментарий к этой ошибке: Android issue tracker bug

Любые предложения, идеи или обходные оценили!

-Стив

+0

Я испытываю такую ​​же ошибку :( –

ответ

3

Я думаю, что, возможно, на самом деле нашли обходной путь для этого.Она включает в себя переопределение openOptionsMenu() метод:

@Override 
public void openOptionsMenu() 
{ 
    mActionBar.showOverflowMenu(); 
} 

Для того, чтобы showOverflowMenu() работать на устройствах с физической клавишей меню, которые ниже API 19, используйте: How to force action bar overflow icon to show

mActionBar назначается как таковой:

android.support.v7.widget.Toolbar mActionBar = (android.support.v7.widget.Toolbar) getActionBar(getWindow().getDecorView()) 

Это getActionBar() метод:

public static ViewGroup getActionBar(View view) 
{ 
    try 
    { 
     if (view instanceof ViewGroup) 
     { 
      ViewGroup viewGroup = (ViewGroup) view; 

      if (viewGroup instanceof android.support.v7.widget.Toolbar) 
      { 
       return viewGroup; 
      } 

      for (int i = 0; i < viewGroup.getChildCount(); i++) 
      { 
       ViewGroup actionBar = getActionBar(viewGroup.getChildAt(i)); 

       if (actionBar != null) 
       { 
        return actionBar; 
       } 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    return null; 
} 

Вызов openOptionsMenu() из AppCompatActivity теперь работает!

ПРИМЕЧАНИЕ: Я проверил это на API 26, но, видя, как метод getActionBar() работает намного ниже, я не вижу причин, остальное это потерпит неудачу.

0

Более простой, чем пост Странника, и это идет хорошо в genymotion, а также в моем мобильном телефоне (зефир):

import android.support.v7.widget.Toolbar; 

//btMainMenu is a button 
public void btMainMenu_click(View view) { 
    final View view2 = getWindow().getDecorView().findViewById(R.id.action_bar); 
    if (view2 instanceof Toolbar) { 
     ((Toolbar) view2).showOverflowMenu(); 
    } 
    else { 
     System.out.println("What a pity!, it doesn't work..., view2 is not toolbar"); 
    } 
} 

https://issuetracker.google.com/issues/37060139

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