web-dev-qa-db-fra.com

Onglets Actionbar Android sous l'onglet initialement sélectionné

J'ai remarqué que lors de l'utilisation 

actionBar.setSelectedNavigationItem(x)

dans la méthode onCreate () de mon activité, l'élément de tabulation à la position 0 est toujours sélectionné en premier, puis l'élément de tabulation à la position x est chargé. Cela signifie que (depuis que j'utilise des fragments), 2 fragments sont chargés. L'un d'eux étant inutile ...

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

Il semble que l'onglet à la position 0 soit sélectionné initialement par défaut. Mais, comme vous pouvez le constater, je passe des ensembles pour m'assurer que le dernier onglet sélectionné est toujours sélectionné lorsque la méthode activity onCreate () est exécutée à nouveau.

Par exemple, Si le dernier onglet sélectionné est à la position 2, onCreate () s’exécute et si l’onglet à la position 0 est chargé, l’onglet à la position 2 est également chargé.

Comment puis-je m'assurer que le ActionBar ne sélectionne pas d'abord l'onglet à la position 0 lors de l'utilisation de actionBar.setSelectedNavigationItem (position).

22
mdupls

Utilisez les autres appels addTab pour remplacer ce comportement. Vous devez d'abord ajouter l'onglet que vous souhaitez sélectionner (dans votre cas, l'onglet à la position 2). Javadoc pertinent

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

Pour tous ceux qui souhaitent le faire, vous pouvez également définir l'onglet sélectionné en définissant la position, puis définir true ou false pour indiquer quel onglet doit être sélectionné.

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

Voici la documentation sur cette approche: http://developer.Android.com/reference/Android/app/ActionBar.html#addTab(Android.app.ActionBar.Tab, int, boolean)

18
bkurzius

vous pouvez utiliser la commande ci-dessous dans la méthode activeonStart:

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

quelle variable mainTab ici est de type Tab. De cette façon, vous devez définir des onglets en tant que variables de classe comme ceci:

Tab mainTab, tab2,tab3;

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

Si vous avez 3 onglets (c'est-à-dire l'onglet 0, l'onglet 1, l'onglet 2) et souhaitez que l'onglet 1 soit présélectionné. Faire ceci:

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

Vous utiliserez:

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

selon cette spécification API .

2
Percy Vega

La réponse de Percy Vega semble être la meilleure solution qui fonctionne.

    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

la réponse de bkurzius m'a aidé à résoudre un problème que j'avais avec le même problème.

Ce que j'ai fait était:

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

De cette manière, le paramètre setSelected n'est vrai que si mTabSelected est égal à l'index de l'onglet.

0
Fletcher Johns