wake-up-neo.com

Android ActionBar-Registerkarten legen die ursprünglich ausgewählte Registerkarte fest

Ich habe das bei der Verwendung bemerkt 

actionBar.setSelectedNavigationItem(x)

in der onCreate () -Methode meiner Aktivität wird immer zuerst das Registerelement an Position 0 ausgewählt und dann das Registerelement an Position x geladen. Dies bedeutet, dass (da ich Fragmente verwende) 2 Fragmente geladen werden. Einer von ihnen ist unnötig ...

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 Registerkarte an Position 0 anfänglich standardmäßig ausgewählt ist. Wie Sie jedoch sehen können, übergeben Sie Pakete, um sicherzustellen, dass die letzte ausgewählte Registerkarte weiterhin ausgewählt ist, wenn die Aktivitätsmethode onCreate () erneut ausgeführt wird.

Wenn sich zum Beispiel Der letzte ausgewählte Tab auf Position 2 befindet, onCreate () ausgeführt wird und der Tab an Position 0 ist, wird der Tab an Position 2 geladen.

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

22
mdupls

Verwenden Sie die anderen addTab-Aufrufe, um dieses Verhalten zu überschreiben. Sie müssen zuerst die Registerkarte hinzufügen, die Sie auswählen möchten (in Ihrem Fall die Registerkarte an Position 2). Relevante Javadoc

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

Für alle anderen Benutzer, die dies tun möchten, können Sie die Registerkarte auch durch Auswahl der Position auswählen und dann true oder false festlegen, um anzugeben, welche Registerkarte ausgewählt werden soll

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

Hier sind die Dokumente zu diesem Ansatz: http://developer.Android.com/reference/Android/app/ActionBar.html#addTab(Android.app.ActionBar.Tab, int, boolean)

18
bkurzius

sie können die folgende Aussage in der AktivitivonStartMethode verwenden:

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

welche mainTab-Variable hier vom Typ Tab ist. Auf diese 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
    ....
}
3
VSB

Wenn Sie über 3 Registerkarten verfügen (d. H. Tab 0, Tab 1, Tab 2), und Tab 1 vorwählen soll. Mach das:

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

Sie werden verwenden:

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

gemäß dieser API-Spezifikation .

2
Percy Vega

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

die Antwort von bkurzius half mir, ein Problem zu lösen, das ich mit dem gleichen Problem hatte.

Was ich gemacht habe 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 ist der setSelected-Parameter nur dann true, wenn mTabSelected dem Index der Registerkarte entspricht.

0
Fletcher Johns