2012-03-27 9 views
22

Ich habe bemerkt, dass, wennAndroid ActionBar Registerkarten eingestellt zunächst Tab ausgewählt

mit
actionBar.setSelectedNavigationItem(x) 

im onCreate() -Methode meiner Aktivität, die Registerkarte Element an der Position 0 wird immer zuerst ausgewählt und dann auf die Registerkarte Element an der Position x ist geladen. Das bedeutet, dass (seit ich Fragmente benutze) 2 Fragmente geladen sind. Einer von ihnen nicht notwendig zu sein ...

Hier ist mein Code:

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); 
} 

Es scheint, dass die Lasche an Position 0 zunächst standardmäßig ausgewählt. Aber wie Sie sehen, übergebe ich Bündel, um sicherzustellen, dass der zuletzt ausgewählte Tab immer noch ausgewählt ist, wenn die Aktivität onCreate() erneut ausgeführt wird. Beispiel: Wenn sich die zuletzt ausgewählte Registerkarte an Position 2 befindet, die onCreate() ausgeführt wird und die Registerkarte an Position 0 geladen ist, wird die Registerkarte an Position 2 geladen.

Wie kann ich sicherstellen, dass die ActionBar bei Verwendung von actionBar.setSelectedNavigationItem (position) nicht zuerst die Registerkarte an Position 0 auswählt.

Antwort

34

Verwenden Sie die anderen addTab Aufrufe, um dieses Verhalten zu überschreiben. Sie müssen die Registerkarte hinzufügen, die zuerst ausgewählt werden soll (in Ihrem Fall die Registerkarte an Position 2). Relevant Javadoc

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

Das ist perfekt. Ich dachte mir, dass es eine einfache Lösung gibt. Vielen Dank. – mdupls

+0

Es funktioniert, aber ich kann den Übergang von ViewPager sehen, wenn Aktivität erstellt wird. Gibt es einen Weg, wie man es deaktiviert? – sealskej

+0

Ich bin mir nicht sicher, ob ich das gleiche Problem des Fragestellers hatte. In meinem Fall wurde die Funktion setSelectedNavigationItem (...) beim Aufruf onCreate meiner Aktivität das Fragment zweimal oder öfter instanziiert. Ändern für dieses Problem zu lösen. Vielen Dank. –

18

Für alle anderen suchen, dies zu tun setzen Sie können auch auf die Registerkarte ausgewählt, indem die Position einstellen und dann wahr oder falsch gesetzt, um anzuzeigen, welche Registerkarte sollte

actionBar.addTab(tab1, 0, false); 
actionBar.addTab(tab2, 1, true); 
actionBar.addTab(tab3, 2, false); 

Hier sind die ausgewählt werden docs auf diesem Ansatz: http://developer.android.com/reference/android/app/ActionBar.html#addTab(android.app.ActionBar.Tab, int, boolean)

3

Sie unter statment in activtiy können onStart Methode:

protected void onStart() { 
    super.onStart(); 
    actionBar.selectTab(mainTab); 
} 

welche mainTab-Variable hier vom Typ Tab ist. diese Art und Weise müssen Sie Registerkarten als klassenweite Variablen wie folgt definieren:

Tab mainTab, tab2,tab3; 

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

Wenn Sie 3 Registerkarten (d Registerkarte 0, Register 1, Tab 2) und wollen Tab 1 vorgewählt werden. Tun Sie dies:

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

Sie verwenden werden:

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

gemäß this API specification.

0

Die Antwort von bkurzius half mir, ein Problem zu beheben, das ich mit dem gleichen Problem hatte.

Was ich tat, war:

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()); 

Auf diese Weise der setSelected Parameter ist nur wahr, wenn mTabSelected auf die Registerkarte des Index gleich ist.

+0

Ihr mTabSelected sollte ein Int und kein Boolean sein. – mdupls

+0

Hoppla, spät in die Nacht kopieren. Es ist ein Int. Vielen Dank. Bearbeitung... –

0

Die Antwort von Percy Vega scheint die beste Arbeitslösung zu sein.

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); 
    } 
Verwandte Themen