Android: как воссоздать панель действий при изменении фрагмента

У меня есть активность, показывающая несколько фрагментов. Представление Activity содержит только ViewPager, инициализированный пользовательским FragmentPagerAdapter. Этот адаптер обеспечивает навигацию между 3-мя фрагментами.

Кажется, все работает нормально, кроме панели действий.

I override onCreateOptionsMenu() method in my fragments to create individual Action bar for any fragment:

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

//fragment specific menu creation }

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

Это выглядит довольно плохо, когда панель действий изменяется через некоторое время после завершения смахивания. Как я могу воссоздать панель действий сразу же, до начала смахивания?


person mc.dev    schedule 23.01.2013    source источник


Ответы (4)


Вы можете попросить Android воссоздать панель действий до того, как это произойдет автоматически, вызвав invalidateOptionsMenu();

Сделайте это где-нибудь рядом с точкой, где вы меняете фрагменты, чтобы попытаться уменьшить «задержку» между изменением фрагмента и панели действий.

Изменить

полное решение может выглядеть так:

class activity extends Activity{

private void switchFragment(){

...do fragment changing stuff

activity.invalidateOptionsMenu();

}

}

class someFragment extends Fragment{

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


    //fragment specific menu creation
}

}

какой бы фрагмент ни был открыт во время

activity.invalidateOptionsMenu();

затем назовет его

 onCreateOptionsMenu

и вы можете создавать отдельные фрагменты меню там

person roarster    schedule 23.01.2013
comment
Проблема в том, что я не мог найти очевидного способа попросить Android воссоздать панель действий. - person mc.dev; 23.01.2013
comment
@Mik, я обновил свой ответ, чтобы помочь, но я не совсем вас понимаю ... invalidateOptionsMenu () должен попросить Android воссоздать панель действий - person roarster; 23.01.2013
comment
Спасибо за ответ, но 1. Когда вы вызываете .invalidateOptionsMenu (); система на самом деле не воссоздает панель действий. Это только вызывает вызов onCreateOptionsMenu () в вашем фрагменте, позволяя вам изменить меню (которое является частью панели действий). Если вы вызвали setHasOptionsMenu (true) в своем фрагменте, вам даже не нужно вызывать invalidateOptionsMenu (), потому что onCreateOptionsMenu () вызывается автоматически. 2. Мне не удалось найти способ вызвать onCreateOptionsMenu () до того, как было проведено смахивание. - person mc.dev; 23.01.2013

Это можно сделать, реализовав onCreateOptionsMenu и вызвав setHasOptionsMenu (true) в обратном вызове onAttach в каждом фрагменте и соответствующим образом изменив действия.

Чтобы показать фрагмент без каких-либо действий, в нем установитеHasOptionsMenu (false)

person Kumait    schedule 18.05.2013
comment
Спасибо, что упомянули onAttach и setHasOptionsMenu! - person Steven; 15.04.2016

Если вы используете вкладки ActionBar, вы хотели бы увидеть этот ответ:

Как я могу динамически изменять действия панели действий?

person David    schedule 31.08.2014

В конце концов, я не смог найти никакого надежного способа добиться этого.

Лучше всего сделать панель действий частью фрагмента, а не активности, но это невозможно.

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

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

person mc.dev    schedule 27.01.2013