Utilice diferentes colores para diferentes ActionBar.Tab
Quiero que todas las pestañas de ActionBar tengan diferentes indicadores de color, por ejemplo, azul para la pestaña 1, rojo para la pestaña 2, etc.
Para lograrlo creé diferentes selectores para todos los colores y los puse en diferentes xmls en drawable. En style.xml los estoy llamando por
- Cambiar la altura de la barra de acción en Android JellyBean
- Android WebView en diferentes pestañas
- Android: ¿Por qué no debo usar actividades dentro de pestañas?
- No se puede mostrar 2 instancias de mi SurfaceView personalizado
- TabLayout seleccionado El icono Tab no está seleccionado al iniciar:
<style name="MyTheme" parent="AppBaseTheme"> <item name="android:actionBarTabStyle">@style/ActionBarTabStyleRed</item> </style> <style name="ActionBarTabStyleRed"> <item name="android:background">@drawable/tab_indicator_red</item> </style>
He creado ese estilo para diferentes colores también. Ahora cuando cambio el dibujable o el estilo al color diferente, trabaja. Puedo ver los colores que se aplican a las pestañas. Pero ya que todas las pestañas son del mismo color, no resolvió mi propósito. Intenté fijar el estilo de las lengüetas en onTabSelected()
pero no hay método para hacer eso.
En última instancia, traté de crear diferentes temas para diferentes colores y trató de establecerlos de forma programada en onTabSelected()
, pero luego he llegado a saber que el tema debe ser establecido antes setContentView()
.
Así que mis preguntas son … ¿Cómo puedo hacer eso? ¿Hay alguna manera que puedo tener diferentes colores para diferentes indicadores de pestañas ???
Actualizar:-
el dibujable / tab_indicator_red.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Non focused states --> <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@android:color/transparent" /> <item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/tab_selected_red" /> <!-- Focused states --> <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_unselected_focused_red" /> <item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/tab_selected_focused_red" /> <!-- Pressed --> <!-- Non focused states --> <item android:state_focused="false" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed_red" /> <item android:state_focused="false" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed_red" /> <!-- Focused states --> <item android:state_focused="true" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed_red" /> <item android:state_focused="true" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed_red" /> </selector>
- Utilización de una clase genérica para objetos múltiples (pestañas de acciónBar)
- Anidar las pestañas en Android 4 con la biblioteca de soporte (ActionBarSherlock)
- Android: el uso de la memoria aumenta cada vez que se hace clic en la pestaña (cuando se utiliza el grupo de actividades)
- Cambiar fragmentos dentro de la pestaña
- TabHost and tabWidget icon problema
- Las pestañas de la barra de acción no llenan la pantalla en android
- ¿Cómo se puede eliminar el relleno o margen en Tabwidget en android?
- Implementación de BackStack para Fragmentos en las pestañas de Android
Creo que tengo un punto de partida para ti, pero es un poco complicado. Configuración de la barra de acción con el código siguiente, puede configurar las pestañas para utilizar aspecto personalizado:
//...somewhere in oncreate ActionBar bar = getActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.Tab tab1 = bar.newTab(); TextView tv1 = createTab("Tab 1", R.drawable.firsttabdrawable); tab1.setCustomView(tv1); tab1.setTabListener(this); ActionBar.Tab tab2 = bar.newTab(); tab2.setCustomView(createTab("Tab 2", R.drawable.secondTabDrawable)); tab2.setTabListener(this); ActionBar.Tab tab3 = bar.newTab(); tab3.setCustomView(createTab("Tab 3", R.drawable.thirdTabDrawable)); tab3.setTabListener(this); ActionBar.Tab tab4 = bar.newTab(); tab4.setCustomView(createTab("Tab 4", R.drawable.fourthTabDrawable)); tab4.setTabListener(this); bar.addTab(tab1); bar.addTab(tab2); bar.addTab(tab3); bar.addTab(tab4);
createTab como sigue:
private TextView createTab(String titleText, int tabBackgroundDrawableId) { TextView tv = new TextView(this); //set caption and caption appearance tv.setTextAppearance(this, R.style.MyDefaultTabTextAppearance); tv.setText(titleText); //set appearance of tab tv.setBackgroundResource(tabBackgroundDrawableId); tv.setLayoutParams(new android.view.ViewGroup.LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT)); //Make sure all tabs have the same height tv.setMaxLines(2); tv.setMinLines(2); return tv; }
Sin embargo, la barra de acción parece agregar la vista de pestañas a una vista principal que añade el relleno para cada una de las que necesita eliminar. Hice esto en el oncreate después del primer bloque de código así:
View view = (View) tv1.getParent(); LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams)view.getLayoutParams(); view.setPadding(0, 0, 0, 0); view.setLayoutParams(lp);
Usted puede encontrar una forma más graciosa / directa de hacer esto, pero como punto de partida que pensé que valía la pena publicar.
Espero que esto ayude.
ADICIONAL:
También puede valer la pena señalar que si tiene un diseño más complicado para su pestaña puede inflar un archivo xml de diseño en el método createTab en su lugar. Por ejemplo, utilizando el siguiente xml (mytab.xml):
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tabIcon"/> <TextView style="@style/MyDefaultTabTextAppearance" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@+id/tabIcon" android:minLines="2" android:maxLines="2" android:id="@+id/tabText"/> </RelativeLayout>
createTab se convierte en:
private RelativeLayout createTab(String titleText, int tabBackgroundDrawableId) { RelativeLayout rl = (RelativeLayout)this.getLayoutInflater().inflate(R.layout.mytab, null, false); //set appearance of tab rl.setBackgroundResource(tabBackgroundDrawableId); TextView tv = (TextView)rl.findViewById(R.id.tabText); //set caption tv.setText(titleText); ImageView iv = (ImageView)rl.findViewById(R.id.tabIcon); iv.setImageResource(R.drawable.ic_launcher);//or supply unique drawable to method? return rl; }
- No entiendo cómo usar diferentes imágenes de densidad para 1.6+
- El ID de registro de la aplicación no se genera en GCM Android