2012-11-05 6 views
12

Mam problem z uzyskaniem następującego kodu. Mam viewpager z 3 fragmentami i chcę, aby ikona wyszukiwania pojawiała się tylko na jednym. Zacząłem próbować dodać funkcję wyszukiwania według fragmentu, ale renderowanie elementu menu było powolne podczas przesuwania do tej strony. Jestem teraz na części, aby dodać ikonę wyszukiwania do aktywności, a potem po prostu ukryć lub pokazać w zależności od viewpager strona jest aktywna, ale po nie działa:Android: Wyświetlanie pozycji menu paska czynności w zależności od ViewPagera

public class MyApp extends FragmentActivity implements 
    FragmentTeams.FragmentNotification,ViewPager.OnPageChangeListener, 
     OnNavigationListener{ 

    ... 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 

    menuSearch = menu.findItem(R.id.menu_search); 
    mSearchView = new SearchView(this); 
    menuSearch.setActionView(mSearchView); 
    menuSearch.setVisible(false); 
    return true; 
} 

@Override 
public void onPageSelected(int pageNum) { 

if(pageNum== 1){  
    ActionBar actionBar = MyApp.this.getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);  
     menuSearch.setVisible(true); 
     invalidateOptionsMenu(); 

}else{   
    ActionBar actionBar = MyApp.this.getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
     menuSearch.setVisible(false); 
     invalidateOptionsMenu(); 
    } 
} 

Chociaż powyższy sposób (wydaje się) tworzenie i ukryć ikonę w onCreateOptionsMenu, nie jest reenabled po przeniesieniu do

pageNum ==1 

Czy ktoś może mi dać pewne wyobrażenie, dlaczego tak się dzieje?

Odpowiedz

22

invalidateOptionsMenu uczynić system wywołuje metodę onPrepareOptionsMenu, więc można zastąpić tę metodę, co następuje:

public boolean onPrepareOptionsMenu(Menu menu) { 
     int pageNum = getCurrentPage(); 
     if (pageNum == 1) { 
     menu.findItem(R.id.menu_search).setVisible(true); 

     } 
     else { 
     menu.findItem(R.id.menu_search).setVisible(false); 
     } 
    } 

public void onPageSelected(int pageNum) { 
    invalidateOptionsMenu(); 
} 
+1

Dzięki za szybką odpowiedź! To działa poprawnie. Jednak od przesunięcia strony do strony i renderowania pozycji menu nadal jest niewielkie opóźnienie. Zamierzam przyjrzeć się nowym aplikacjom Google, ponieważ wygląda na to, że od razu je renderują. – Josh

+1

Jeśli korzystasz z biblioteki pomocy technicznej, to jej 'supportInvalidateOptionsMenu()' – IronBlossom

+1

Nie mogę znaleźć metody getCurrentPage(), czy jest to userdefined czy sam Android? –

4

można zaimplementować onCreateOptionsMenu() w Fragmentu i Ustaw „setHasOptionsMenu (true)” dla fragmentu

+0

Zrobiłem to i działa na niektórych urządzeniach; ale na innych urządzeniach działa tylko wtedy, gdy przejdziesz do następnej strony i wrócisz (nie działa za pierwszym razem). – Roel

+0

To dziwne ... czuje się jak błędy w konkretnej implementacji tych urządzeń ... cholerni producenci .. . – Boy

0

możliwym rozwiązaniem tego problemu byłoby pompowania swoje menu niestandardowego wewnątrz aktywność gospodarze swoją ViewPager i coraz odniesienie menu jak poniżej:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.custom_menu, menu); 
    customMenu = menu; 
    return super.onCreateOptionsMenu(menu); 
} 

po tym można łatwo ukryć/pokazać pozycje menu, bez żadnych opóźnień wewnątrz metody onPageSelected jak poniżej:

@Override 
public void onPageSelected(int position) { 
    switch (position) { 
     case 0: { 
      customMenu.getItem(0).setVisible(false); 
      break; 
     } 
     case 1: { 
      customMenu.getItem(0).setVisible(true); 
      break; 
     } 
    }