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

Имам дейност, показваща няколко фрагмента. Изглед на дейност съдържа само 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 във всеки фрагмент и съответно промяна на действията.

За да покажете фрагмента без никакви действия setHasOptionsMenu(false) в него

person Kumait    schedule 18.05.2013
comment
Благодаря ви, че споменахте onAttach и setHasOptionsMenu! - person Steven; 15.04.2016

Ако използвате раздели ActionBar, бихте искали да видите този отговор:

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

person David    schedule 31.08.2014

Накрая не можах да намеря никакъв здрав начин да постигна това.

Най-добре би било да направите лентата за действие част от фрагмент, а не от дейност, но това е невъзможно.

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

In дава известно забавяне във времето и лентата за действие изглежда странно празна по време на плъзгане, но е най-доброто, което можете да направите.
API на Android е c...

person mc.dev    schedule 27.01.2013