2016-12-28 3 views
0

В моем фрагменте я хочу показать только меню/MenuItems в моей панели инструментов в ландшафтном режиме. Когда я меняю ориентацию, я замечаю, что onCreateOptionsMenu и onPrepareOptionsMenu не вызывается.onCreateOptionsMenu и onPrepareOptionsMenu не вызвано изменением ориентации

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

public class MyFragment extends Fragment 
{ 
    private int orientation; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     orientation = getResources().getConfiguration().orientation; 
     if (orientation == Configuration.ORIENTATION_LANDSCAPE) 
      setHasOptionsMenu(true); 

     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
    { 
     if (orientation == Configuration.ORIENTATION_LANDSCAPE) 
      inflater.inflate(R.menu.my_menu, menu); 

     super.onCreateOptionsMenu(menu, inflater); 
    } 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) 
    { 
     initializeLandscapeMenuViews(menu); 
     super.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) 
    { 
     super.onViewCreated(view, savedInstanceState);   
     if (orientation == Configuration.ORIENTATION_PORTRAIT) 
      initializePortraitMenuViews(view); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     return inflater.inflate(R.layout.my_layout, container, false); 
    } 

// other code not shown 
} 

Катастрофа происходит, когда я пытаюсь получить доступ мнения, что я инициализировать в initializeLandscapeMenuViews(), потому что onPrepareOptionsMenu() никогда не вызывается.

Я проверил порядок вызовов с использованием отладчика:

Запуск в ландшафтном режиме

  1. onCreate
  2. onViewCreated
  3. onCreateOptionsMenu
  4. onPrepareOptionsMenu

затем, изменение ориентации в портретную

  1. onCreate
  2. onViewCreated

затем, изменение ориентации обратно в пейзаж

  1. onCreate
  2. onViewCreated

onCreateOptionsMenu и onPrepareOptionsMenu не называются

Что мне не хватает? (Любая помощь приветствуется).

ответ

0

В принципе, я не вижу никаких проблем с вашим подходом. тем не менее, вы пробовали вызывать invalidateOptionsMenu()? Предполагается сообщить операционной системе, что вы хотите перерисовать свои меню, вызывая onCreateOptionsMenu().

+0

Привет @Idanatz, я действительно пробовал это, но эти обратные вызовы не вызываются :( – Vinnie

-1

Редактировать: Я думал, что TS работает с действиями, но использует фрагменты. Сожалею.

Если вы работаете в этом бизнесе, то onCreateOptionsMenu и onPrepareOptionsMenu имеют возвращаемое значение типа Boolean. Итак, вы должны вернуть логическое (вместо void). В вашем текущем подходе вы не отменяете функции из-за этого. Вот почему кажется, что функции никогда не называются. Для получения дополнительной информации см. API.

+0

Пожалуйста, внимательно прочитайте вопрос. Я расширяю 'Фрагмент', а не' Активность'. – Vinnie

+0

Вы правы, я пропустил эту часть. Сожалею. – Richh94

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