Ich verwende a TabLayout
mit a ViewPager
und frage mich, wie ich die Farbe des Symbols der ausgewählten Registerkarte im TabLayout am effizientesten ändern kann.
Eine perfekte Referenz für die Implementierung ist die Youtube-App von Google . Auf der Hauptseite befinden sich vier dunkelgraue Symbole. Wenn eine bestimmte Registerkarte ausgewählt ist, wird das Symbol der Registerkarte weiß.
Wie kann ich ohne Bibliotheken von Drittanbietern den gleichen Effekt erzielen?
Eine mögliche Lösung sind offenbar Selektoren. In diesem Fall müsste ich jedoch sowohl eine weiße als auch eine graue Version des Symbols finden und dann das Symbol wechseln, wenn die Registerkarte ausgewählt oder abgewählt wird. Ich frage mich, ob es eine effektivere Methode gibt, bei der ich nur die Symbolfarbe oder etwas anderes hervorheben kann. Ich konnte dies in keinem Tutorial finden.
BEARBEITEN
Die Lösung, die ich direkt oben erwähne, erfordert die Verwendung von zwei Zeichen für das Symbol jeder Registerkarte. Ich frage mich , ob es einen Weg gibt , ich es programmatisch mit tun kann ONE ziehbar für jeden Reiter das Symbol.
android-studio
Tag nur, wenn es für die IDE spezifisch ist.Antworten:
Ich habe einen Weg gefunden, der einfach sein kann.
viewPager = (ViewPager) findViewById(R.id.viewpager); setupViewPager(viewPager); tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(viewPager); tabLayout.setOnTabSelectedListener( new TabLayout.ViewPagerOnTabSelectedListener(viewPager) { @Override public void onTabSelected(TabLayout.Tab tab) { super.onTabSelected(tab); int tabIconColor = ContextCompat.getColor(context, R.color.tabSelectedIconColor); tab.getIcon().setColorFilter(tabIconColor, PorterDuff.Mode.SRC_IN); } @Override public void onTabUnselected(TabLayout.Tab tab) { super.onTabUnselected(tab); int tabIconColor = ContextCompat.getColor(context, R.color.tabUnselectedIconColor); tab.getIcon().setColorFilter(tabIconColor, PorterDuff.Mode.SRC_IN); } @Override public void onTabReselected(TabLayout.Tab tab) { super.onTabReselected(tab); } } );
quelle
Dies kann sehr einfach und vollständig in XML erfolgen.
Fügen Sie Ihrem TabLayout in Ihrer XML
app:tabIconTint="@color/your_color_selector"
wie folgt eine Zeile hinzu :<android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabIconTint="@color/your_color_selector" app:tabIndicatorColor="@color/selected_color"/>
Erstellen Sie dann eine Farbauswahldatei (oben "your_color_selector.xml" genannt) im Verzeichnis res / color:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/selected_color" android:state_selected="true"/> <item android:color="@color/unselected_color"/> </selector>
Dies setzt voraus, dass Ihre Farben.xml-Datei zwei Farben enthält: "selected_color" und "unselected_color".
quelle
private void setupTabIcons() { tabLayout.getTabAt(0).setIcon(tabIcons[0]); tabLayout.getTabAt(1).setIcon(tabIcons[1]); tabLayout.getTabAt(2).setIcon(tabIcons[2]); tabLayout.getTabAt(3).setIcon(tabIcons[3]); tabLayout.getTabAt(0).getIcon().setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN); tabLayout.getTabAt(1).getIcon().setColorFilter(Color.parseColor("#a8a8a8"), PorterDuff.Mode.SRC_IN); tabLayout.getTabAt(2).getIcon().setColorFilter(Color.parseColor("#a8a8a8"), PorterDuff.Mode.SRC_IN); tabLayout.getTabAt(3).getIcon().setColorFilter(Color.parseColor("#a8a8a8"), PorterDuff.Mode.SRC_IN); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { tab.getIcon().setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN); } @Override public void onTabUnselected(TabLayout.Tab tab) { tab.getIcon().setColorFilter(Color.parseColor("#a8a8a8"), PorterDuff.Mode.SRC_IN); } @Override public void onTabReselected(TabLayout.Tab tab) { } }); }
quelle
setCurrentItem(0)
deronBackButton()
Methode eine Instanz von viewPager aus der Aktivität aufrufen. Der Benutzer wird immer beim ersten Fragment zurückgegeben, wenn er versucht, die App zu beenden .Sie können eine ColorStateList verwenden.
Erstellen Sie zunächst eine XML-Datei (z. B.
/color/tab_icon.xml
), die so aussieht und die verschiedenen Farbtöne für verschiedene Zustände definiert:<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/icon_light" android:state_selected="true" /> <item android:color="@color/icon_light_inactive" /> </selector>
Fügen Sie dies dann Ihrem Code hinzu:
ColorStateList colors; if (Build.VERSION.SDK_INT >= 23) { colors = getResources().getColorStateList(R.color.tab_icon, getTheme()); } else { colors = getResources().getColorStateList(R.color.tab_icon); } for (int i = 0; i < tabLayout.getTabCount(); i++) { TabLayout.Tab tab = tabLayout.getTabAt(i); Drawable icon = tab.getIcon(); if (icon != null) { icon = DrawableCompat.wrap(icon); DrawableCompat.setTintList(icon, colors); } }
Zuerst holen Sie sich die ColorStateList aus Ihrem XML (die Methode ohne Thema ist veraltet, aber für Geräte vor Marshmallow erforderlich). Anschließend legen Sie für das Symbol jeder Registerkarte die TintList für die ColorStateList fest. Verwenden Sie DrawableCompat (Unterstützungsbibliothek), um auch ältere Versionen zu unterstützen.
Das ist es!
quelle
tabLayout
) initialisiert wurde.Dafür müssen Sie Registerkartensymbole mithilfe der Auswahlklasse für jede Registerkarte wie folgt anpassen:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/advisory_selected" android:state_selected="true" /> <item android:drawable="@drawable/advisory_normal" android:state_selected="false" />
quelle
Fügen Sie dies unter
res > colors
Verzeichnis hinzu:<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:color="@android:color/holo_orange_dark"/> <item android:color="@android:color/holo_red_light"/> </selector>
Fügen Sie Code in der Registerkartenansicht in XML hinzu:
app:tabIconTint="@color/selector_tab"
quelle
Warum verwenden Sie für Ihre Symbole keine Symbolschriftarten (wie "Fantastik")? Ändern Sie dann die Schriftart des Tabulatortextes in das gewünschte Schriftart-Symbol .ttf und genießen Sie es, die ausgewählte Textfarbe in Ihre Tabulator-Symbole zu ändern!
Ich selbst habe diese Methode angewendet und sie ist wirklich schön und sauber :)
Richten Sie zunächst die Titel der gewünschten Symbolschriftart ein:
in string.xml:
<string name="ic_calculator"></string> <string name="ic_bank"></string>
dann in MainActivity.Java:
private void setupViewPager(ViewPager viewPager) { ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); adapter.addFragment(new FragmentBank(), getString(R.string.ic_bank)); adapter.addFragment(new FragmentCalculate(), getString(R.string.ic_calculator)); viewPager.setAdapter(adapter); }
Dann sollten Sie die Schriftart von Tab-Titeln in font-awesome ändern:
Typeface typeFaceFont = Typeface.createFromAsset(getAssets(), "fontawesome-webfont.ttf"); TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(viewPager); ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0); int tabsCount = vg.getChildCount(); for (int j = 0; j < tabsCount; j++) { ViewGroup vgTab = (ViewGroup) vg.getChildAt(j); int tabChildsCount = vgTab.getChildCount(); for (int i = 0; i < tabChildsCount; i++) { View tabViewChild = vgTab.getChildAt(i); if (tabViewChild instanceof TextView) { ((TextView) tabViewChild).setTypeface(typeFaceFont); } } }
Und zu guter Letzt legen Sie in Ihrer zugehörigen XML-Datei die Farbe für tabTextColor und tabSelectedTextColor fest:
<android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="horizontal" android:background="@color/colorPrimaryDark" app:tabSelectedTextColor="@color/colorAccent" app:tabTextColor="@color/textColorPrimary" app:tabIndicatorColor="@color/colorAccent" app:tabMode="fixed" app:tabGravity="fill"/> </android.support.design.widget.TabLayout>
und in colours.xml:
<resources> <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#303F9F</color> <color name="colorAccent">#FF4081</color> <color name="colorHighlight">#FFFFFF</color> <color name="textColorPrimary">#E1E3F3</color> </resources>
quelle
Überprüfen Sie den folgenden Code. Passen Sie Ihr Symbol an, eines ist Farbe und ein anderes ist keine Farbe.
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/mybookings_select" android:state_selected="true"/><!-- tab is selected(colored icon)--> <item android:drawable="@drawable/mybookings" /><!-- tab is not selected(normal no color icon)-->
quelle
In Bezug auf die zweite Antwort, die zeigt, wie die Farbe separat eingestellt wird, fragen sich viele Leute möglicherweise, wie sie die Farbe des ersten Symbols entfernen können, während sie zum nächsten wechseln. Was Sie tun können, ist wie folgt:
private void setupTabIcons() { tabLayout.getTabAt(0).setIcon(tabIcons[0]); tabLayout.getTabAt(1).setIcon(tabIcons[1]); tabLayout.getTabAt(2).setIcon(tabIcons[2]); tabLayout.getTabAt(3).setIcon(tabIcons[3]); tabLayout.getTabAt(0).getIcon().setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN); tabLayout.getTabAt(1).getIcon().setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN); tabLayout.getTabAt(2).getIcon().setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN); tabLayout.getTabAt(3).getIcon().setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { tab.getIcon().setColorFilter(Color.GREEN,PorterDuff.Mode.SRC_IN); } @Override public void onTabUnselected(TabLayout.Tab tab) { //for removing the color of first icon when switched to next tab tablayout.getTabAt(0).getIcon().clearColorFilter(); //for other tabs tab.getIcon().clearColorFilter(); } @Override public void onTabReselected(TabLayout.Tab tab) { } });}
Ich hätte die zweite Antwort kommentiert, hatte aber nicht genug Ruf dafür! Es tut uns leid. Aber bitte folgen Sie, dass Sie Ihre Zeit und Ihre Kopfschmerzen sparen würden! Viel Spaß beim Lernen
quelle
Sie können verwenden
addOnTabSelectedListener
, es funktioniert für mich.tablayout = findViewById(R.id.viewall_tablayout); pager = findViewById(R.id.viewall_pager); adapter = new ViewPagerAdapter(getSupportFragmentManager()); adapter.addFragments(new RestFragment(),"Restaurant"); adapter.addFragments(new BarFragment(),"Bar"); adapter.addFragments(new HotelFragment(),"Hotel"); adapter.addFragments(new CoffeeFragment(),"Coffee Shop"); pager.setAdapter(adapter); tablayout.setupWithViewPager(pager); tablayout.getTabAt(0).setIcon(R.drawable.ic_restaurant); tablayout.getTabAt(1).setIcon(R.drawable.ic_glass_and_bottle_of_wine); tablayout.getTabAt(2).setIcon(R.drawable.ic_hotel_black_24dp); tablayout.getTabAt(3).setIcon(R.drawable.ic_hot_coffee); tablayout.getTabAt(0).getIcon().setTint(getResources().getColor(R.color.colorAccent,getTheme())); tablayout.getTabAt(1).getIcon().setTint(getResources().getColor(R.color.colorAccent,getTheme())); tablayout.getTabAt(2).getIcon().setTint(getResources().getColor(R.color.colorAccent,getTheme())); tablayout.getTabAt(3).getIcon().setTint(getResources().getColor(R.color.colorAccent,getTheme())); tablayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { tab.getIcon().setTint(getResources().getColor(R.color.colorPrimary,getTheme())); } @Override public void onTabUnselected(TabLayout.Tab tab) { tab.getIcon().setTint(getResources().getColor(R.color.colorAccent,getTheme())); } @Override public void onTabReselected(TabLayout.Tab tab) { } });
quelle
Eine Möglichkeit, das Symbol "hervorzuheben", besteht darin, auf die Bildansicht zuzugreifen und den Farbfilter einzustellen. Versuchen Sie es mit der ImageCiew-Methode setColorFilter (int color) und wenden Sie die Farbe Weiß an.
quelle
tabLayout.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager) {...}
Wurde veraltet. Eher verwendentabLayout.addOnTabSelectedListener(new TabLayout.BaseOnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { int tabIconColor = ContextCompat.getColor(context, R.color.tabSelectedIconColor); tab.getIcon().setColorFilter(tabIconColor, PorterDuff.Mode.SRC_IN); } @Override public void onTabUnselected(TabLayout.Tab tab) { int tabIconColor = ContextCompat.getColor(context, R.color.tabUnselectedIconColor); tab.getIcon().setColorFilter(tabIconColor, PorterDuff.Mode.SRC_IN); } @Override public void onTabReselected(TabLayout.Tab tab) { } });
quelle
Wenn Sie meine bevorzugte Antwort von hier aus mit der ColorStateList erweitern , können Sie die folgende Lösung verwenden, wenn Sie benutzerdefinierte Registerkarten verwenden.
Richten Sie Registerkarten in der XML-Datei Ihrer Aktivität ein
... <android.support.design.widget.TabLayout android:id="@+id/main_tablayout" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.design.widget.TabItem android:layout_width="match_parent" android:layout_height="match_parent" android:layout="@layout/nav_bar_tab_item"/> <android.support.design.widget.TabItem android:layout_width="match_parent" android:layout_height="match_parent" android:layout="@layout/nav_bar_tab_item"/> </android.support.design.widget.TabLayout> ...
Und benutzerdefiniertes Registerkartenlayout nav_bar_item.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout android:id="@+id/nav_bar_item_layout" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:paddingEnd="@dimen/_5sdp" android:paddingStart="@dimen/_5sdp"> <ImageView android:id="@+id/item_img" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"/> <TextView android:id="@+id/item_description" android:layout_width="wrap_content" android:gravity="center" <!-- Use selector here to change the text color when selected/unselected --> android:textColor="@color/nav_bar_icons_color" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/item_img"/> </android.support.constraint.ConstraintLayout>
In Ihrer Tätigkeit
tabLayout = findViewById(R.id.main_tablayout); ConstraintLayout navMyHotelLayout = (ConstraintLayout) tabLayout.getTabAt(0) .getCustomView(); tab1Icon = navMyHotelLayout.findViewById(R.id.item_img); tab1TextView = navMyHotelLayout.findViewById(R.id.item_description); tab1Icon.setImageResource(R.drawable.ic_tab1); // Use the selector here to change the color when selected/unselected tintImageViewSelector(tab1Icon, R.color.nav_bar_icons_color); tab1TextView.setText("tab 1"); ConstraintLayout navTtdLayout = (ConstraintLayout) tabLayout.getTabAt(1) .getCustomView(); tab2Icon = navTtdLayout.findViewById(R.id.item_img); tab2View = navTtdLayout.findViewById(R.id.item_description); tab2Icon.setImageResource(R.drawable.ic_tab2); tintImageViewSelector(tab2Icon, R.color.nav_bar_icons_color); tab2TextView.setText("tab 2");
Und fügen Sie diese Hilfsfunktionen für den Farbwechsel hinzu
public static void tintDrawableSelector(Drawable vd, final @ColorRes int clrRes, Context context) { DrawableCompat.setTintList(vd, ContextCompat.getColorStateList(context, clrRes)); } public static void tintImageViewSelector(ImageView imgView, final @ColorRes int clrRes, Context context) { tintDrawableSelector(imgView.getDrawable(), clrRes); }
Schließlich der Selektor nav_bar_icons_color.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@android:color/white" android:state_checked="true"/> <item android:color="@android:color/white" android:state_selected="true"/> <item android:color="@android:color/black"/> </selector>
quelle
Überprüfen Sie den folgenden Code:
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { if(tab.getPosition() == 0){ tabLayout.getTabAt(0).setIcon(tabIcons1[0]); } if(tab.getPosition() == 1){ tabLayout.getTabAt(1).setIcon(tabIcons1[1]); } if(tab.getPosition() == 2){ tabLayout.getTabAt(2).setIcon(tabIcons1[2]); } } @Override public void onTabUnselected(TabLayout.Tab tab) { tabLayout.getTabAt(0).setIcon(tabIcons[0]); tabLayout.getTabAt(1).setIcon(tabIcons[1]); tabLayout.getTabAt(2).setIcon(tabIcons[2]); } @Override public void onTabReselected(TabLayout.Tab tab) { } });
quelle
Sie können die Textfarbe der ausgewählten Registerkarte mithilfe des folgenden XML-Attributs des Registerkartenlayouts ändern:
app:tabSelectedTextColor="your desired color"
Um die Symbolfarbe der ausgewählten Registerkarte anzupassen, müssen Sie den Selektor verwenden. Erstellen Sie eine XML-Datei unter einem zeichnbaren Ordner:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="selected_item_color" android:state_activated="true" /> <item android:color="unselected_item_color" /> </selector>
und fügen Sie diesen Selektor wie folgt zum XML-Attribut des Registerkartenlayouts hinzu:
app:tabIconTint="@drawable/name_of_file"
quelle
Führen Sie jeweils die folgenden Schritte aus.
app / src / main / res / values / Farben.xml (Zu Farben.xml hinzufügen)
<color name="icon_enabled">#F3D65F</color> <color name="icon_disabled">#FFFFFF</color>
app / src / main / res / color / custom_tab_icon.xml (Erstellen Sie einen Ordner mit dem Namen color in res. Erstellen Sie eine benutzerdefinierte Registerkarte icon.xml im Ordner.)
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/icon_enabled" android:state_selected="true"/> <item android:color="@color/icon_disabled" android:state_selected="false"/> </selector>
app / src / main / res / drawable / ic_action_settings.png (Erstellen)
Doppelklicken Sie auf action_settings, um es hinzuzufügen
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="21.6" android:viewportHeight="21.6" android:tint="@color/custom_tab_icon"> <group android:translateX="-1.2" android:translateY="-1.2"> <path android:fillColor="#FF000000" android:pathData="M19.1,12.9a2.8,2.8 0,0 0,0.1 -0.9,2.8 2.8,0 0,0 -0.1,-0.9l2.1,-1.6a0.7,0.7 0,0 0,0.1 -0.6L19.4,5.5a0.7,0.7 0,0 0,-0.6 -0.2l-2.4,1a6.5,6.5 0,0 0,-1.6 -0.9l-0.4,-2.6a0.5,0.5 0,0 0,-0.5 -0.4H10.1a0.5,0.5 0,0 0,-0.5 0.4L9.3,5.4a5.6,5.6 0,0 0,-1.7 0.9l-2.4,-1a0.4,0.4 0,0 0,-0.5 0.2l-2,3.4c-0.1,0.2 0,0.4 0.2,0.6l2,1.6a2.8,2.8 0,0 0,-0.1 0.9,2.8 2.8,0 0,0 0.1,0.9L2.8,14.5a0.7,0.7 0,0 0,-0.1 0.6l1.9,3.4a0.7,0.7 0,0 0,0.6 0.2l2.4,-1a6.5,6.5 0,0 0,1.6 0.9l0.4,2.6a0.5,0.5 0,0 0,0.5 0.4h3.8a0.5,0.5 0,0 0,0.5 -0.4l0.3,-2.6a5.6,5.6 0,0 0,1.7 -0.9l2.4,1a0.4,0.4 0,0 0,0.5 -0.2l2,-3.4c0.1,-0.2 0,-0.4 -0.2,-0.6ZM12,15.6A3.6,3.6 0,1 1,15.6 12,3.6 3.6,0 0,1 12,15.6Z"/> </group> </vector>
quelle