Фрагмент, не получающий обратные вызовы меню - PullRequest
39 голосов
/ 08 июня 2011

У меня есть фрагментный класс, который расширяет Fragment и вызывает setHasOptionsMenu для участия в меню. Этот класс также реализует onCreateOptionsMenu, onPrepareOptionsMenu и onOptionsItemSelected.

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

Я динамически загружаю этот фрагмент, используя FragmentTransaction в моей Деятельности (которая расширяет FragmentActivity).

Однако ни один из обратных вызовов меню (onCreateOptionsMenu, onPrepareOptionsMenu и onOptionsItemSelected) не вызывается (я отлаживал с некоторыми точками останова в этих методах), и меню не отображается.

Я что-то упустил? Нужно ли что-то добавить в свою активность?

Я использую библиотеку совместимости Android, компилирую с L11 SDK и тестирую в Xoom.

РЕДАКТИРОВАТЬ : Я нашел проблему. Мой AndroidManifest ориентирован на L11, это, кажется, скрывает кнопку меню и предотвращает обратные вызовы. Однако, если я удаляю это из манифеста, я теряю некоторые другие необходимые мне функции (например, активированное состояние в списках). Кто-нибудь знает, как решить эту проблему (включить кнопку меню), не удаляя targetSdkVersion=11 из манифеста?

Ответы [ 12 ]

1 голос
/ 15 апреля 2014

У меня была та же проблема, и решение, которое работало для меня:

  1. Удалите или прокомментируйте любые onOptionsItemSelected (), onMenuItemSelected (), даже onPrepareOptionMenu (), и оставьте только в Activity onCreateOptionsMenu ():

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater=getMenuInflater();
    inflater.inflate(R.layout.menu, menu);
    return true;
    }
    
  2. В классе Fragment, в onCreateView (), поместите:

    setHasOptionsMenu(true);
    
  3. В классе Fragment добавить:

    @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
     super.onCreateOptionsMenu(menu,inflater);      
     }
    
    @Override
     public boolean onOptionsItemSelected(MenuItem item){           
             switch(item.getItemId()){
             case R.id.action_insert:
                //doing stuff
             return true;
             }
             return false;
         }
    

Протестировано и работало на Android 4.4

1 голос
/ 08 июня 2011

Я думаю, что вы реализовали onCreateOptionsMenu, onPrepareOptionsMenu и onOptionsItemSelected в классе, extends Fragment.Попробуйте сделать это в классе Activity, куда вы загружаете этот фрагмент

...