21 votes

Comment changer d'onglet de façon programmatique en utilisant le bouton-clic dans Android ?

Je suis aux prises avec ce problème depuis quelques jours maintenant. J'essaie de changer d'onglet de manière programmatique en cliquant sur un bouton. Mon programme fonctionne parfaitement si j'utilise simplement les onglets pour changer d'activité, mais le câblage d'une méthode onClick avec setCurrentTab entraîne une erreur. C'est la méthode qui ne fonctionne pas. Il s'agit d'une fonction assez basique et simple, mais je n'ai pas vu beaucoup de documentation ou d'exemples de personnes essayant de câbler un clic de bouton avec des onglets de changement. Merci.

ImageButton next = (ImageButton) findViewById(R.id.ButtonAsk);
 next.setOnClickListener(new View.OnClickListener() 
         {         
  public void onClick(View view)  
             {

                TabHost tabHost =  (TabHost) findViewById(android.R.id.tabhost);
              tabHost.setCurrentTab(2);                
             }
         });

Voir l'historique des modifications pour le journal des erreurs.

26voto

Scott Biggs Points 958

Voici un exemple de code que vous pouvez placer dans votre onClick(). C'est comme Mark et Kevin l'ont décrit.

    TabActivity tabs = (TabActivity) getParent();
    tabs.getTabHost().setCurrentTab(2);

J'ai utilisé ce code de nombreuses fois. J'espère que cela vous éclairera.

17voto

CommonsWare Points 402670

Il n'y a pas de widget avec @android:id/tabhost dans l'activité en cours. D'où, findViewById() retourne null, et votre appel à setCurrentTab() échoue.

A mon avis, c'est parce que vous mettez des activités dans vos onglets. Si vous aviez mis Views dans vos onglets, votre code fonctionnerait. Votre code serait également plus rapide, occuperait moins d'espace dans le tas et risquerait moins de manquer d'espace dans la pile.

Si vous souhaitez conserver votre implémentation actuelle, essayez d'appeler getParent().findViewById() au lieu de simplement findViewById() .

8voto

Suragch Points 197

Réponse 2017

Les autres réponses semblent être dépassées. Le site Création de vues glissantes avec des onglets La documentation recommande d'utiliser TabLayout avec un ViewPager .

Voici une implémentation partielle du code pour faire cela.

public class MainActivity extends AppCompatActivity {

    private ViewPager mViewPager;
    private Button mButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ...

        mViewPager = (ViewPager) findViewById(R.id.fieldspager);

        // ...

        mButton.setOnClickListener(myButtonClickHandler);
    }

    View.OnClickListener myButtonClickHandler = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mViewPager.setCurrentItem(2, true);
        }
    };
}

À partir du code ci-dessus, la définition de l'onglet de manière programmatique se fait comme suit :

mViewPager.setCurrentItem(2, true); // set it to the third tab

Voici une autre mise en œuvre avec plus de détails sur la façon dont le visualisateur et la disposition des onglets sont configurés.

7voto

Paul Points 507

Cela fonctionne pour moi

getActionBar().setSelectedNavigationItem(0);

Mise à jour : j'ai ajouté mon code au code de la question pour lui donner plus de contexte...

ImageButton next = (ImageButton) findViewById(R.id.ButtonAsk);
next.setOnClickListener(new View.OnClickListener()
{
    public void onClick(View view)
    {
        getActionBar().setSelectedNavigationItem(2);
    }
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X