Pregunta

Tengo una actividad que tiene un TabHost que contiene un conjunto de TabSpecs, cada uno con una vista de lista que contiene los elementos que mostrará la pestaña.Cuando se crea cada TabSpec, configuro un icono para que se muestre en el encabezado de la pestaña.

Las TabSpecs se crean de esta manera dentro de un setupTabs() método que se repite para crear el número apropiado de pestañas:

TabSpec ts = mTabs.newTabSpec("tab");
ts.setIndicator("TabTitle", iconResource);

ts.setContent(new TabHost.TabContentFactory(
{
    public View createTabContent(String tag)
    {
        ... 
    }            
});
mTabs.addTab(ts);

Hay un par de casos en los que quiero poder cambiar el ícono que se muestra en cada pestaña durante la ejecución de mi programa.Actualmente estoy eliminando todas las pestañas y volviendo a llamar al código anterior para volver a crearlas.

mTabs.getTabWidget().removeAllViews();
mTabs.clearAllTabs(true);
setupTabs();

¿Hay alguna manera de reemplazar el ícono que se muestra sin eliminar y volver a crear todas las pestañas?

¿Fue útil?

Solución

La respuesta corta es: no te estás perdiendo nada.El SDK de Android no proporciona un método directo para cambiar el indicador de un TabHost después de haber sido creado.El TabSpec solo se usa para construir la pestaña, por lo que cambiar el TabSpec después del hecho no tendrá ningún efecto.

Sin embargo, creo que hay una solución.Llamar mTabs.getTabWidget() conseguir un TabWidget objeto.Esta es solo una subclase de ViewGroup, para que puedas llamar getChildCount() y getChildAt() para acceder a pestañas individuales dentro del TabWidget.Cada una de estas pestañas también es una Vista, y en el caso de una pestaña con un indicador gráfico y una etiqueta de texto, es casi seguro que sea alguna otra. ViewGroup (tal vez un LinearLayout, pero no importa) que contiene un ImageView y un TextView.Entonces, con un poco de jugueteo con el depurador o Log.i, deberías poder encontrar una receta para obtener el ImageView y cambiarlo directamente.

La desventaja es que si no tienes cuidado, el diseño exacto de los controles dentro de una pestaña podría cambiar y tu aplicación podría fallar.Su solución inicial es quizás más sólida, pero también podría provocar otros efectos secundarios no deseados, como parpadeos o problemas de enfoque.

Otros consejos

Sólo para confirmar la respuesta de Dominic, aquí está su solución en código (que realmente funciona):

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        if (TAB_MAP.equals(tabId)) {
            ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_black));
            iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_white));
        } else if (TAB_LIST.equals(tabId)) {
            ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_white));
            iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_black));
        }
    }
});

Por supuesto, no está nada pulido y usar esos índices directos en getChildAt() no es nada agradable...

Puede que sea un poco tarde, pero quizás quieras echarle un vistazo a este hilo.

http://groups.google.com/group/android-developers/browse_thread/thread/ef3bdebcb715b385

Vea mi publicación con un ejemplo de código sobre Pestañas de Android personalizadas.

Gracias SPCT

Esto es lo que hice y funciona para mí.Creé esta función en la actividad que se extiende desde TabBarActivity

public void updateTab(int stringID) {
    ViewGroup identifyView = (ViewGroup)getTabWidget().getChildAt(0);
    TextView v =  (TextView)identifyView.getChildAt(identifyView.getChildCount() - 1);
    v.setText(stringID);
}

Puede modificar esta función para cambiar la imagen en lugar del texto o puede cambiar ambas, también puede modificar esto para obtener cualquier pestaña secundaria.Estaba particularmente interesado en modificar el texto de la primera pestaña en tiempo de ejecución.

Llamé a esta función desde la actividad relevante usando esta llamada

getParent().updateTab(R.string.tab_bar_analyze);

Prueba esto:

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        if (TAB_MAP.equals(tabId)) {
            ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_black));
            iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_white));
        } else if (TAB_LIST.equals(tabId)) {
            ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_white));
            iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_black));
        }
    }
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top