web-dev-qa-db-fra.com

Comment utiliser les sélecteurs pour changer les icônes avec le nouveau TabLayout

J'utilise le nouveau support TabLayout d'Android. Le fait est que je voulais utiliser des sélecteurs pour changer l'icône lorsqu'un onglet est sélectionné. 

J'ai examiné le code source et il me semble que cela ne change jamais l'état de la vue (et pour cette raison, je ne peux pas utiliser le sélecteur).

Est-ce que quelqu'un connaît une solution de contournement?

Je vous remercie!

15
Fábio Carballo

Il est possible de définir customView comme un onglet avec setCustomView (View View) method. Ainsi, vous pouvez créer une vue texte et lui attribuer un sélecteur, puis définir cette vue comme onglet.

J'espère que ça vous aide!

0
Anitha Manikandan

Supposons que votre my_selector.xml est,

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@drawable/icon_on" Android:state_selected="true"/>
    <item Android:drawable="@drawable/icon_off"/> <!-- default -->
</selector>

alors vous pouvez appeler directement setIcon,

tab.setIcon(R.drawable.my_selector);

Vérifié avec 'com.Android.support:design:22.2.0'.

53
Xingang Huang

J'ai constaté que lorsque je définis pour la première fois la vue personnalisée pour chaque onglet de TabLayout, je dois définir le premier (index 0) comme étant sélectionné.

    TabLayout toolbarTabLayout = (TabLayout) findViewById(R.id.tabs);
    toolbarTabLayout.setupWithViewPager(mViewPager);
    toolbarTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    toolbarTabLayout.setTabMode(TabLayout.MODE_FIXED);
    toolbarTabLayout.setTabTextColors(R.color.colorPrimary, R.color.white);
    // Iterate over all tabs and set the custom view
    for (int i = 0; i < toolbarTabLayout.getTabCount(); i++) {
        TabLayout.Tab tab = toolbarTabLayout.getTabAt(i);
        View v=mSectionsPagerAdapter.getTabView(i);
        // no tabs are actually selected at start, this will make sure the
        // selector for the colors comes in right when initialized
        if (i==0)
            v.setSelected(true);
        tab.setCustomView(v);
    }

Cela semble forcer le premier onglet comme sélectionné lorsque la vue personnalisée est appliquée. Cela ressemble vraiment à un bidouillage, espérons que quelqu'un d'autre trouvera le vrai problème et proposera une meilleure solution.

1
BK-

C'est ce qui a fonctionné pour moi:

En supposant que vos sélecteurs soient définis dans le dossier res dessinable (comme Xingang Huang montré ci-dessus) . ce:

for (int i = 0; i < yourTabLayout.getTabCount(); i++) {
        ImageView imageView = new ImageView(this); //your context, in this case MainActivity.class
        imageView.setImageResource(arr_tabIcons[i]); //tabIcons is the array of icons
        if (i==0) {
            imageView.setSelected(true); 
        }
        yourTabLayout.getTabAt(i).setCustomView(imageView);

    }

tab.setIcon (R.drawable.icon)

cela fonctionne également, mais dans mon cas, les icônes semblaient vraiment petites. Je devais donc utiliser la solution avec ImageView pour remplir la vue par onglet.

Bonne codage;)

0
JediCate

Si vous avez tout fait correctement (et je le crois), vous êtes arrivé au même point que moi. Peut-être que c'est un petit bug dans la nouvelle bibliothèque Android appcompat.

j'ai trouvé une solution de contournement (appelée Gambiarra dans un bon Portugais) pour résoudre ce problème. vous devez appeler la méthode select () depuis la classe Tab comme ceci:

mTabLayout.getTabAt(x).select();

MAIS c'est très important: la variable x doit être différente de l'index de tabulation sélectionné.

0
pablobaldez