java - programacion - Actualización de los iconos de la pestaña de Android
manual de programacion android pdf (6)
Ver mi publicación con el ejemplo de código sobre pestañas Android personalizadas .
Gracias Spct
Tengo una actividad que tiene un TabHost que contiene un conjunto de TabSpecs, cada una con una vista de lista que contiene los elementos que se mostrarán en la pestaña. Cuando se crea cada TabSpec, configuro un ícono para mostrar en el encabezado de la pestaña.
Las TabSpecs se crean de esta manera dentro de un método setupTabs()
que realiza un bucle 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 instancias en las que deseo poder cambiar el ícono que se muestra en cada pestaña durante la ejecución de mi programa. Actualmente estoy borrando todas las pestañas y llamando de nuevo 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?
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 de texto o puede cambiar ambas, también puede modificar esto para obtener cualquier ficha 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);
La respuesta corta es que no te falta nada. Android SDK 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 crear la pestaña, por lo que cambiar el TabSpec
después del hecho no tendrá ningún efecto.
Creo que hay una solución, sin embargo. Llame a mTabs.getTabWidget()
para obtener un objeto TabWidget
. Esta es solo una subclase de ViewGroup
, por lo que puede llamar a getChildCount()
y getChildAt()
para acceder a pestañas individuales dentro de TabWidget
. Cada una de estas pestañas es también una Vista, y en el caso de una pestaña con un indicador gráfico y una etiqueta de texto, es casi seguro que algún otro ViewGroup
(tal vez un LinearLayout
, pero no importa) que contiene un ImageView
y un TextView
. Así que con un poco de Log.i
del depurador o Log.i
, debería ser capaz de encontrar una receta para obtener ImageView
y cambiarla directamente.
La desventaja es que si no tiene cuidado, el diseño exacto de los controles dentro de una pestaña podría cambiar y su aplicación podría romperse. Su solución inicial es tal vez más sólida, pero de nuevo puede llevar a otros efectos secundarios no deseados como parpadeo o problemas de enfoque.
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));
}
}
});
Solo para confirmar la respuesta dominicana, 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á pulido en absoluto y el uso de esos índices directos en getChildAt () no es nada agradable ...
Puede ser un poco tarde, pero es posible que desee echar un vistazo a este hilo de grupo de Google