2013-01-23 11 views
23

Mam aktywność pokazującą kilka fragmentów. Widok aktywności zawiera tylko ViewPager zainicjowany niestandardowym FragmentPagerAdapter. Ten adapter zapewnia nawigację wśród 3 fragmentów.Android: Jak odtworzyć pasek akcji po zmianie fragmentu

Wszystko wydaje się działać poprawnie, z wyjątkiem paska czynności.

zastąpić metodę onCreateOptionsMenu() w moim fragmentów stworzyć indywidualny pasek działania na każdym fragmencie: Kiedy zrobić bezstykowa, pojawia się nowy fragment

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

//fragment specific menu creation }

, ale bar działania pozostają takie same przez kilka sekund. Prawdopodobnie po kilku sekundach wywoływana jest ta metoda i zmienia się pasek akcji.

Wygląda całkiem nieźle, gdy pasek akcji zostanie zmieniony po chwili przesuwania. Jak odtworzyć pasek akcji natychmiast, zanim zacznie się przeciąganie?

Odpowiedz

26

Można zapytać android do ponownego utworzenia actionbar zanim automatycznie robi poprzez wywołanie invalidateOptionsMenu();

Czy to gdzieś blisko do punktu, w którym zmienia fragmenty, aby spróbować zmniejszyć „lagi” między fragmentem i actionbar zmianę .

Edycja

kompletny roztwór może wyglądać następująco:

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 
} 

} 

dowolny fragment jest otwarty podczas

activity.invalidateOptionsMenu(); 

następnie wywołać jej

onCreateOptionsMenu 

i możesz utworzyć menu specyficzne dla fragmentów tam

+0

Problem jest nie mogłem znajdź jakiś oczywisty sposób, aby poprosić Androida o odtworzenie paska akcji. –

+0

@Mik Zaktualizowałem swoją odpowiedź, aby pomóc, ale naprawdę nie rozumiem cię w pełni ... invalidateOptionsMenu() powinien "poprosić androida o ponowne utworzenie paska akcji" – roarster

+5

Dzięki, za odpowiedź, ale 1. Kiedy ty wywołać .invalidateOptionsMenu(); system tak naprawdę nie odtwarza paska akcji. Powoduje tylko wywołanie onCreateOptionsMenu() w twoim fragmencie, co pozwala ci zmienić Menu (które jest częścią paska akcji). Jeśli wywołałeś setHasOptionsMenu (true) w twoim fragmencie, to nie musisz nawet wywoływać metody invalidateOptionsMenu(), ponieważ onCreateOptionsMenu() jest wywoływana automatycznie. 2. Nie mogłem znaleźć sposobu wywoływania w CreateOptionsMenu() przed wykonaniem przesunięcia. –

1

Wreszcie nie mogłem znaleźć żadnego rozsądnego sposobu, aby to osiągnąć.

Najlepiej byłoby uczynić z actionbar fragment fragmentu, a nie aktywność, ale to niemożliwe.

Kończy się usunięciem menu paska akcji i tytułu po rozpoczęciu machnięcia (można ustawić specjalny słuchacz w widoku PageView) i zmienić menu i tytuł ponownie po przesunięciu i wyświetleniu nowego fragmentu.

Wprowadza pewne opóźnienie, a pasek akcji wygląda dziwnie pusto podczas przeciągania, ale najlepiej można to zrobić.
Android API to c ...

+0

Jezus ... słabe rozwiązanie! architektura Androida jest bardzo skomplikowana !!! – Mateus

4

Można to zrobić poprzez implementację onCreateOptionsMenu i wywołanie setHasOptionsMenu (true) w wywołaniu zwrotnym onAttach w każdym fragmencie i odpowiednią zmianę akcji.

Aby pokazać fragment bez jakichkolwiek działań setHasOptionsMenu (fałsz) w to

+0

Dziękuję za wzmiankę o 'onAttach' i' setHasOptionsMenu'! – Steven