2012-03-27 18 views
22

Zauważyłem, że podczas korzystaniawypustki Android ActionBar set początkowo wybrany kartę

actionBar.setSelectedNavigationItem(x) 

w metodzie onCreate() mojej działalności, przedmiot zakładka na pozycji 0 jest zawsze wybrany, a następnie element tab w pozycji x jest załadowany. Oznacza to, że (od czasu użycia Fragmentów) są wczytywane 2 Fragmenty. Jednym z nich jest niepotrzebna ...

Oto mój kod:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Determine which bundle to use; either the saved instance or a bundle 
    // that has been passed in through an intent. 
    Bundle bundle = getIntent().getExtras(); 
    if (bundle == null) { 
     bundle = savedInstanceState; 
    } 

    // Initialize members with bundle or default values. 
    int position; 
    if (bundle != null) { 
     position = bundle.getInt("selected_tab"); 
    } else { 
     position = 0; 
    } 

    // Set the tabs. 
    ActionBar actionBar = getActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    Tab tab = actionBar 
      .newTab() 
      .setText("Tab 1") 
      .setTabListener(
        new TabListener<RendersGridFragment>(this, "1", 
          RendersGridFragment.class)); 
    actionBar.addTab(tab); 

    tab = actionBar 
      .newTab() 
      .setText("Tab 2") 
      .setTabListener(
        new TabListener<RendersGridFragment>(this, "2", 
          RendersGridFragment.class)); 
    actionBar.addTab(tab); 

    tab = actionBar 
      .newTab() 
      .setText("Tab 3") 
      .setTabListener(
        new TabListener<RendersGridFragment>(this, "3", 
          RendersGridFragment.class)); 
    actionBar.addTab(tab); 

    actionBar.setSelectedNavigationItem(position); 
} 

Wydaje się, że zakładka na pozycji 0 jest początkowo wybrany domyślnie. Ale, jak widzisz, przekazuję pakiety, aby upewnić się, że ostatnio wybrana karta jest nadal zaznaczona, gdy metoda activity onCreate() jest ponownie uruchamiana.

Na przykład, jeśli ostatnia wybrana zakładka znajduje się w pozycji 2, uruchamiana jest opcja onCreate(), a zakładka na pozycji ma wartość 0, a zakładka w pozycji 2 jest załadowana.

Jak mogę się upewnić, że pasek akcji nie wybierze karty na pozycji 0 jako pierwszej, gdy użyto actionBar.setSelectedNavigationItem (pozycja).

Odpowiedz

34

Użyj innych wywołań addTab, aby zmienić to zachowanie. Najpierw musisz dodać kartę, którą chcesz wybrać (w twoim przypadku, kartę w pozycji 2). Relevant Javadoc

actionBar.addTab(tab2); 
actionBar.addTab(tab0, 0, false); 
actionBar.addTab(tab1, 1, false); 
+0

To jest idealne. Pomyślałem, że jest prosta łatka. Dzięki. – mdupls

+0

Działa, ale widzę przejście do ViewPager po utworzeniu aktywności. Czy jest jakiś sposób, jak to wyłączyć? – sealskej

+0

Nie jestem pewien, czy miałem ten sam problem z autorem pytania. W moim przypadku funkcja setSelectedNavigationItem (...) po wywołaniu na Utwórz moją aktywność fragment został utworzony dwa lub więcej razy. Zmiana w tym rozwiązuje mój problem. Dzięki. –

3

można skorzystać z poniższego statment w activtiy onStart metoda:

, dla której zmienna mainTab ma typ Tab. ten sposób należy definiować zakładki jako zmienne klasy szerokości tak:

Tab mainTab, tab2,tab3; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    //add tabs to action bar 
    .... 
} 
2

Jeśli masz 3 karty (czyli zakładki 0, karta 1, zakładka 2) i chcą tab 1 należy wstępnie. Wykonaj:

for (int i = 0; i < mFragmentPagerAdapter.getCount(); i++) { 
    boolean preselected = (i == 1); 
    actionBar.addTab(actionBar.newTab().setText(
     mFragmentPagerAdapter.getPageTitle(i)).setTabListener(this), preselected); 
} 

Będziesz przy użyciu:

public abstract void addTab (ActionBar.Tab tab, boolean setSelected) 

zgodnie this API specification.

0

Odpowiedź bummusa pomógł mi rozwiązać problem, który miałem z tym samym problemem.

Co zrobiłem było:

private final String TAB_SELECTED = "tab_selected" 
... 
private int mTabSelected; 
... 
mTabSelected = savedInstanceState.getInt(TAB_SELECTED); 
... 
final ActionBar actionbar = getActionBar(); 
... 
actionbar.addTab(tab1, mTabSelected == 0); 
actionbar.addTab(tab2, mTabSelected == 1); 
actionbar.addTab(tab3, mTabSelected == 2); 
... 
outState.putInt(TAB_SELECTED, getActionBar().getSelectedNavigationIndex()); 

ten sposób setSelected parametr jest prawdziwe tylko wtedy, gdy mTabSelected jest równa indeksu tabulatora.

+0

Twój mTabSelected powinien być int, a nie boolean. – mdupls

+0

oops, późne nocne kopiowanie. To jest int. Dzięki. Redagowanie... –

0

Odpowiedź Percy'ego Vegi wydaje się być najlepszym rozwiązaniem roboczym.

for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 

     boolean preselected = (i == ErrorDetails.tab_id); 
     actionBar.addTab(
       actionBar.newTab() 
         .setText(mSectionsPagerAdapter.getPageTitle(i)) 
         .setTabListener(this),preselected); 
    } 
Powiązane problemy