Ma classe s'étend de TabActivity
TabHost mTabHost = getTabHost();
TabHost.TabSpec tab1 =mTabHost.newTabSpec("tab1");
TabHost.TabSpec tab2 =mTabHost.newTabSpec("tab2");
tab1 .setIndicator("title tab1");
tab2 .setIndicator("title tab2");
mTabHost.addTab(tab1);mTabHost.addTab(tab2);
TabHost.setCurrentTab(0 or 1)
Quelqu'un peut-il me guider, comment puis-je changer l'image de fond ou la couleur de l'onglet sélectionné?
Et si vous vous enregistrez pour les événements TabHost.OnTabChanged et appelez mTabHost.getCurrentTabView () pour obtenir la vue, puis view.setBackgroundResource ()?
Cela définira les couleurs de vos onglets:
public static void setTabColor(TabHost tabhost) {
for(int i=0;i<tabhost.getTabWidget().getChildCount();i++) {
tabhost.getTabWidget().getChildAt(i).setBackgroundColor(Color.parseColor("#FF0000")); //unselected
}
tabhost.getTabWidget().getChildAt(tabhost.getCurrentTab()).setBackgroundColor(Color.parseColor("#0000FF")); // selected
}
et si vous le placez dans onTabChangedListener (), il conservera la couleur correcte pour les onglets sélectionnés.
Comme l'a mentionné mbaird, la meilleure solution consiste à utiliser background with selector, de sorte que vous n'avez pas à vérifier onTabChanged
et à effectuer une mise à jour manuelle. Le code minimal est ici:
private void initTabsAppearance(TabWidget tabWidget) {
// Change background
for(int i=0; i < tabWidget.getChildCount(); i++)
tabWidget.getChildAt(i).setBackgroundResource(R.drawable.tab_bg);
}
Où tab_bg
est un fichier XML dessinable avec sélecteur:
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_selected="true" Android:drawable="@drawable/tab_bg_selected" />
<item Android:drawable="@drawable/tab_bg_normal" />
</selector>
Pour la personnalisation complète de l'onglet, je vais ajouter le code permettant de changer le style de texte tab en utilisant un thème personnalisé. Ajoutez ceci à styles.xml
:
<resources>
<style name="MyCustomTheme" parent="@Android:style/Theme.Light.NoTitleBar">
<item name="Android:tabWidgetStyle">@style/CustomTabWidget</item>
</style>
<style name="CustomTabWidget" parent="@Android:style/Widget.TabWidget">
<item name="Android:textAppearance">@style/CustomTabWidgetText</item>
</style>
<style name="CustomTabWidgetText" parent="@Android:style/TextAppearance.Widget.TabWidget">
<item name="Android:textSize">12sp</item>
<item name="Android:textStyle">bold</item>
</style>
</resources>
Pour utiliser ce thème, définissez-le dans AndroidManifest.xml:
<application Android:theme="@style/MyCustomTheme">
Et maintenant, vous avez des widgets à onglets avec fond personnalisé et style de texte personnalisé .
> TabHost mTabHost = getTabHost();
>
> TabHost.TabSpec tab1 =mTabHost.newTabSpec("tab1");
> TabHost.TabSpec tab2 =mTabHost.newTabSpec("tab2");
>
> tab1.setIndicator("title tab1");
> tab2.setIndicator("title tab2");
> mTabHost.addTab(tab1) ;mTabHost.addTab(tab2);
>
> TabHost.setCurrentTab(0 or 1);
mTabHost.getTabWidget().getChildAt(0).setBackgroundResource(R.drawable.tab1selector);
mTabHost.getTabWidget().getChildAt(1).setBackgroundResource(R.drawable.tab2selector);
mTabHost.getTabWidget().getChildAt(2).setBackgroundResource(R.drawable.tab3selector);
mTabHost.getTabWidget().getChildAt(3).setBackgroundResource(R.drawable.tab4selector);
Utilisez .setBackgroundResource et tabNselector est un fichier XML - tabNselector.xml
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_selected="false" Android:drawable="@drawable/tabN"/>
<item Android:state_selected="true" Android:drawable="@drawable/tabNsel" />
</selector>
This résout-il votre problème? Vous appelez essentiellement setBackgroundDrawable sur chaque onglet avec un sélecteur?
J'ai défini le paramètre 'Android: background' dans l'élément TabWidget du fichier XML pour définir l'arrière-plan générique de tous les onglets.
Ensuite, j'ai transmis des vues gonflées à partir d'un autre XML dans la méthode '.setIndicator'.
View v = LayoutInflater.from(this).inflate(R.layout.tab_widget, null);
TextView label = (TextView) v.findViewById(R.id.tabLabel);
label.setText("Whatever");
tab1 .setContent(v);
Je pense que c'est une façon plus agréable de faire cela.