webentwicklung-frage-antwort-db.com.de

Verwendung von Selektoren zum Ändern von Symbolen mit dem neuen TabLayout

Ich verwende den neuen Support TabLayout von Android. Die Sache ist, dass ich Selektoren verwenden wollte, um das Symbol zu ändern, wenn eine Registerkarte ausgewählt wurde. 

Ich habe in den Quellcode hineingeschaut und es scheint mir, als würde er niemals den Status der Ansicht ändern (und aus diesem Grund kann ich die Auswahl nicht verwenden).

Kennt jemand eine Problemumgehung?

Vielen Dank!

15
Fábio Carballo

Es gibt eine Möglichkeit, customView als Registerkarte mit der Methode setCustomView (View view) festzulegen. Sie können also eine Textansicht erstellen, einen Selektor festlegen und diese Ansicht auf die Registerkarte setzen.

Hoffe es hilft dir!

0

Nehmen Sie an, Ihre my_selector.xml ist

<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>

dann können Sie setIcon direkt anrufen,

tab.setIcon(R.drawable.my_selector);

Verifiziert mit 'com.Android.support:design:22.2.0'.

53
Xingang Huang

Ich habe festgestellt, dass beim ersten Festlegen der benutzerdefinierten Ansicht für jede Registerkarte im TabLayout die erste (Index 0) als ausgewählt festgelegt werden muss.

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

Dies scheint die erste Registerkarte zu erzwingen, wenn die benutzerdefinierte Ansicht angewendet wird. Es fühlt sich wirklich wie ein Hack an, hoffentlich wird jemand anderes das wahre Problem herausfinden und eine bessere Lösung vorschlagen.

1
BK-

Das hat bei mir funktioniert:

Angenommen, Sie haben Ihre Selektoren im zeichnbaren res-Ordner (wie Xingang Huang oben angezeigt) . In Ihrer MainActivity (wo Sie Ihr TabLayout einrichten) fügen Sie Ihr Array von Symbol-Selektoren ein und durchlaufen Sie dann wie durch diese:

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)

funktioniert zwar auch, aber in meinem Fall sahen die Icons sehr klein aus, daher musste ich die Lösung mit ImageView verwenden, um die Tabulatoransicht zu füllen.

Viel Spaß beim Codieren;)

0
JediCate

Wenn Sie alles richtig gemacht haben (und ich glaube das), sind Sie an demselben Punkt wie ich angekommen. Vielleicht ist es ein kleiner Fehler in der neuen Android-Appcompat-Bibliothek.

ich habe eine Problemumgehung gefunden (in guten Portugiesen heißt es Gambiarra), um dieses Problem zu lösen. Sie müssen die Methode select () aus der Tab-Klasse folgendermaßen aufrufen:

mTabLayout.getTabAt(x).select();

ABER es ist sehr wichtig: Die Variable x muss sich vom aktuell ausgewählten Registerindex unterscheiden.

0
pablobaldez