2010-01-20 9 views
47

Mi clase extiende extiende TabActivity¿Cómo cambio el fondo de un widget de pestañas de Android?

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) 

me puede orientar nadie cómo puedo cambiar la imagen de fondo o el color de la ficha seleccionada?

Respuesta

25

¿Qué ocurre si se registra en los eventos de TabHost.OnTabChanged y llama a mTabHost.getCurrentTabView() para obtener la Vista, y luego view.setBackgroundResource()?

2

¿El problema this resuelve su problema? Básicamente llamando a setBackgroundDrawable en cada vista de pestaña con un selector?

93

Esto establecerá su paleta de colores:

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 
} 

y si lo pones dentro del onTabChangedListener(), que se mantendrá el color correcto para pestañas seleccionadas.

+0

Muchas gracias, esto realmente me ayudó. ¿Hay alguna forma de implementar este enfoque en XML? – teoREtik

+1

@teoREtik XML es contenido estático, solo para cuando su actividad se inicia por primera vez (inicialización del diseño), entonces no. – Blundell

+0

Gracias por su ayuda. Esta respuesta es muy útil. +1 por eso .. ¡Salud! – Aditya1510

36

Como mbaird mencionado, la mejor solución es utilizar fondo con el selector, por lo que no tiene que comprobar onTabChanged y hacer una actualización manual. El código mínimo está aquí:

private void initTabsAppearance(TabWidget tabWidget) { 
    // Change background 
    for(int i=0; i < tabWidget.getChildCount(); i++) 
     tabWidget.getChildAt(i).setBackgroundResource(R.drawable.tab_bg); 
} 

Dónde tab_bg es un dibujable xml con el selector:

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

Para la personalización ficha completa voy a añadir el código para cambiar el estilo del texto pestaña utilizando tema personalizado. Agregue esto a 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> 

Para utilizar este tema, definirlo en AndroidManifest.xml:

<application android:theme="@style/MyCustomTheme"> 

Y ahora usted tiene widgets de pestaña con el fondo encargo y el estilo de texto de encargo .

0

Establecí el parámetro 'android: background' en el elemento TabWidget del XML para dar el fondo genérico de todas las pestañas.

Luego pasé las vistas infladas de otro XML en el método '.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); 

Creo que es una mejor manera de hacerlo.

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

Uso .setBackgroundResource y tabNselector es un 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> 
Cuestiones relacionadas