2012-10-01 15 views
6

Mam do czynienia z jednym problemem dotyczącym przesuwania karty. Mój projekt jest oparty na systemie Android 3.2. Implementuję przeciąganie kart za pomocą biblioteki obsługi 4.0 (Android-support-v4.jar). Wszystko, co zaimplementowałem działa dobrze, ale kiedy wdrażam moją aplikację na urządzeniu ICS, to w trybie portretowym otrzymuję spinner na pasku akcji do wyboru karty. W trybie portretowym wybór karty nie zmienia się po przesunięciu, chociaż zawartość się zmienia i wszystko działa poprawnie w trybie poziomym.Jak wyświetlić zaznaczony fragment w zakładce paska akcji

final ActionBar actionBar = getActionBar(); 
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
actionBar.setDisplayHomeAsUpEnabled(true); 
// Set up the ViewPager with the sections adapter. 
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager); 

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 

    @Override 
    public void onPageSelected(int position) { 
     actionBar.setSelectedNavigationItem(position); 
    } 

}); 

Próbowałem oddanie breakpoint actionBar.setSelectedNavigationItem(position); na tej linii, a nawet w trybie portretowym to nazywa uzyskiwanie ale wybór nie ulega zmianie.

Czy ktoś może w tym pomóc?

edycja: Znaleziono similar problem ale nie widać dokładnie, jak to jest rozwiązane i jak zintegrować go w moim kodu.

+0

myślę, że to działa w moim próba: https://github.com/commonsguy/cw-omnibus/tree/master/ViewPager/TabPager Jednakże, polecam rozważyć przełączanie z kart paska akcji na 'PagerTabStrip' lub smak tabulatora ViewPagerIndicator, dla spójnych zakładek w różnych orientacjach: https://github.com/commonsguy/cw-omnibus/tree/master/ViewPager/Indicator – CommonsWare

+0

Dzięki za odpowiedź, będę zobacz linki i potrzebuję tylko przesuwania karty, ale dziękuję za sugestię. Spróbuję wdrożyć PagerTabStripe i sprawdzić, czy jest lepiej. – Android

Odpowiedz

16

Problem: Z powodu niewystarczającego stanu rzeczywistego platforma wykorzystuje zwiniętą nawigację (tj. Spinner). System automatycznie określa NAVIGATION_MODE_TABS dla krajobrazu & NAVIGATION_MODE_LIST dla portretu, zmieniając orientację z pionowej na pionową aktualizuje interfejs użytkownika, ale z jakiegoś powodu nie aktualizuje właściwości trybu nawigacyjnego na NAVIGATION_MODE_LIST i dlatego nie jest wywoływane mActionView.setDropdownSelectedPosition (pozycja). Zobacz poniższy kod ActionBarImpl: setSelectedNavigationItem

public void setSelectedNavigationItem(int position) { 
    switch (mActionView.getNavigationMode()) { 
    case NAVIGATION_MODE_TABS: 
     selectTab(mTabs.get(position)); 
     break; 
    case NAVIGATION_MODE_LIST: 
     mActionView.setDropdownSelectedPosition(position); 
     break; 
    default: 
     throw new IllegalStateException(
       "setSelectedNavigationIndex not valid for current navigation mode"); 
    } 
} 

rozwiązanie Obejście: poprzez odbicie możemy uzyskać turbinki obiektu Tab i wywołać metodę setSelection.

private Spinner getTabSpinner() 
{ 
    try 
    { 
     int id = getResources().getIdentifier("action_bar", "id", "android"); 
     View actionBarView = findViewById(id); 

     Class<?> actionBarViewClass = actionBarView.getClass(); 
     Field mTabScrollViewField = actionBarViewClass.getDeclaredField("mTabScrollView"); 
     mTabScrollViewField.setAccessible(true); 

     Object mTabScrollView = mTabScrollViewField.get(actionBarView); 
     if (mTabScrollView == null) { 
      return null; 
     } 

     Field mTabSpinnerField = mTabScrollView.getClass().getDeclaredField("mTabSpinner"); 
     mTabSpinnerField.setAccessible(true); 

     Object mTabSpinner = mTabSpinnerField.get(mTabScrollView); 
     if (mTabSpinner != null) 
     { 
      return (Spinner)mTabSpinner; 
     } 
    } 
    catch (Exception e) { 
     return null; 
    } 

    return null; 
} 

Następnie wywołaj powyższą metodę w zdarzeniu onPageSelected.

 public void onPageSelected(int position) { 
      actionBar.setSelectedNavigationItem(position); 
      Spinner spinner = getTabSpinner(); 
      if (spinner != null) { 
       spinner.setSelection(position); 
      } 
     } 

Zaproszony ten Opublikuj https://gist.github.com/2657485

+0

Hej dużo Thnx Wayofhope. Przejdę przez twój przykład i pokażę ci postęp. – Android

+0

Hej Dzięki Way of Hope. Działa świetnie. Rozwiązałem mój 5-dniowy problem. Jeszcze raz dziękuję. – Android

+0

Świetnie !!! Ciesz się kolego. –

Powiązane problemy