¿Puedo utilizar el estilo de tabulación predeterminado en mi vista de pestaña personalizada?

Mi actividad principal es TabActivity , pero mis pestañas no requieren iconos. Sé que puedo omitir el icono utilizando el TabHost.TabSpec.setIndicator(CharSequence label) sobrecargado, como se responde en esta pregunta .

Pero el espacio donde iría el icono todavía está reservado, por lo que se pierde mucho espacio. Esto ya se ha señalado en esta pregunta . Parece que no puedo reducir la altura de la pestaña. Tendré que proporcionar mi propia View con la TabHost.TabSpec.setIndicator(View view) .

Bien, pero quiero asegurarme de que el resto del estilo (fondo / color) permanezca consistentemente "android" en todos los dispositivos, como si hubiera usado un indicador de pestaña predeterminado. Así que no quiero suministrar mis propios colores.

He encontrado @android:color/tab_indicator_text y su uso para TextView s texto-color parece funcionar como se esperaba. Pero no sé dónde obtener los valores predeterminados de tabulador-colores de fondo. También he descubierto el @android:style/Widget.TabWidget , pero su aplicación a ni TextView ni el LinearLayout rodea parece ayudar.

Este es mi archivo de visualización de indicador de la pestaña xml, tomado de algún tutorial:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tabLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:padding="12dip" > <TextView android:id="@+id/tabText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/tab_indicator_text" /> </LinearLayout> 

¿Cómo puedo obtener el estilo de pestaña 'android default' en esto?


Edit: A continuación, intenté agregar una pestaña predeterminada a través de setIndicator(CharSequence) , tomar el getBackground de su vista de indicador, borrar todas las pestañas, añadir mis vistas personalizadas (ver más arriba), luego poner el drawable que recuperó en setBackground para el nuevo Indicadores.

El resultado parece un poco correcto y equivocado. Por un lado, son demasiado altos de nuevo, así que no gané nada. Por otra parte, los estados de fondo de todas las pestañas están ahora vinculados de alguna manera (activos, resaltados, seleccionados, etc.). El uso de mutate() en el drawable (s) no ayudó en absoluto. Siguiente truco: He añadido tres pestañas predeterminadas, tomó todos sus antecedentes, los borró, y dio a mis propias tres pestañas un fondo cada uno.

Bueno, eso soluciona el segundo problema. Sus estados ya no están vinculados. Pero siguen siendo demasiado altos. Así que reduje la altura del TabWidget usando updateViewLayout . Esto funciona, pero deja una barra descolorada en la parte superior de los indicadores de pestaña.

En realidad, acabo con la misma situación que cuando se utiliza el TabHost.TabSpec.setIndicator(CharSequence label) método. Y de todos modos, todos estos hacks me hacen sentir sucio. ¿No hay una forma elegante de obtener el estilo predeterminado de Android en una vista personalizada?

Este código tomado de fuentes android tab_indicator.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="0dip" android:layout_height="64dip" android:layout_weight="1" android:layout_marginLeft="-3dip" android:layout_marginRight="-3dip" android:orientation="vertical" android:background="@android:drawable/tab_indicator"> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" /> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" style="?android:attr/tabWidgetStyle" /> </RelativeLayout> 

Puede intentar simplemente tomar este código, eliminar el ImageView , cambiar layout_centerHorizontal en el TextView a layout_center , reducir la altura de RelativeLayout y proporcionar esta vista en TabHost.TabSpec.setIndicator(View view) . Hay referencias sólo a @android recursos, por lo que no es necesario crear ningún texto o estilos de texto.

EDITAR

El fondo estándar drawable de Android para el indicador de pestaña no es visible desde una aplicación, pero es posible hacerlo así:

 TabSpec tc = getTabHost().newTabSpec("tag"); tc.setIndicator("indicator1"); tc.setContent(content); getTabHost().addTab(tc); getTabHost().findViewById(android.R.id.icon).setVisibility(View.GONE); TextView tv = (TextView) getTabHost().findViewById(android.R.id.title); RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); rllp.addRule(RelativeLayout.CENTER_IN_PARENT); tv.setLayoutParams(rllp); 

Entonces es posible reducir la altura de las lengüetas:

 RelativeLayout parent = ((RelativeLayout) tv.getParent()); ViewGroup.LayoutParams vglp = parent.getLayoutParams(); vglp.height = android.view.ViewGroup.LayoutParams.WRAP_CONTENT; parent.setLayoutParams(vglp); 

El resultado será: esta

Creo que la mejor opción sería personalizar el aspecto de las pestañas usando archivos xml llamados selectores (que pondrás en tu carpeta "drawable"), un tab_indicator.xml personalizado en tu carpeta "layout", un estilo para el texto y un tema Utilizando dicho estilo.

Este es el tab_indicator_selector.xml que va en la carpeta "drawable" y es requerido por el tab_indicator.xml:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Non focused states ... --> <!-- Focused states ... --> <!-- Pressed --> <item android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/tab_pressed" /> <item android:state_pressed="true" android:drawable="@drawable/tab_pressed" /> </selector> 

Y este es el selector de estado tab_pressed.xml:

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:top="53dp"> <shape android:shape="rectangle"> <solid android:color="@color/white" /> </shape> </item> <item android:top="53dp" android:bottom="1dp"> <shape android:shape="rectangle"> <solid android:color="@color/white" /> </shape> </item> <item android:left="2dp" android:right="2dp"> <shape android:shape="rectangle"> <gradient android:angle="90" android:startColor="@color/black" android:endColor="@color/white" /> <stroke android:width="2dp" android:color="@color/red" /> </shape> </item> </layer-list> 

Los otros estados se pueden lograr creando tab_focused.xml, tab_selected.xml y tab_unseleceted.xml y estableciendo las combinaciones right android: state_XXX.

El tab_indicator va así:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="0dip" android:layout_height="52dip" <!-- Control the height of the Tab here! --> android:layout_weight="1" android:orientation="vertical" android:background="@drawable/tab_indicator_selector" android:layout_marginTop="2dp" android:padding="2dp"> <!-- Generally here goes an ImageView, but you said you don't want it. --> <TextView android:id="@+id/tab_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="11dp" android:textStyle="bold" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" style="?android:attr/tabWidgetStyle" /> </RelativeLayout> 

En el lado de la implementación, debe tener este aspecto:

 private void setTabs(){ tabHost = getTabHost(); addTab(R.string.tab_title_something, R.drawable.tab_something_selector, new Intent().setClass(this, PlacesNearbyTab.class)); } private void addTab(int labelId, int drawableId, Intent intent) { TabHost.TabSpec spec = tabHost.newTabSpec("tab" + labelId); View tabIndicator = LayoutInflater.from(this).inflate(R.layout.tab_indicator, getTabWidget(), false); TextView title = (TextView) tabIndicator.findViewById(R.id.tab_title); title.setText(labelId); spec.setIndicator(tabIndicator); spec.setContent(intent); tabHost.addTab(spec); } 

Espero que ayude. Es una solución larga, pero el uso de temas y estilos es bastante útil cuando la aplicación ha crecido, o cuando desea cambiar su aspecto en la versión 2.

Finalmente te sugiero que revises el nuevo SDK versión 14 y el tema Holo. Las fichas de Holo son para Tablets y Teléfonos y puedes hacerlas con y sin iconos.

No estoy seguro si esto centrará el texto, pero puede cambiar la altura de la pestaña sin cambiar el fondo predeterminado de Android.

Prueba esto:

 TabHost tabs = //initialize your TabHost here tabs.setup(); TabSpec tspec1 = tabs.newTabSpec("First Tab"); tspec1.setIndicator("Actions"); tabs.addTab(tspec1); tabs.getTabWidget.getChildAt(0).getLayoutParams().height = (int) (35 * 1.5); 

Donde 35 es la altura en píxeles, y multiplicar por 1,5 hace que la altura 35dp.

Buena suerte.

Podría intentar el siguiente código de ejemplo, que se toman de tab_indicator.xml predeterminado y hacer una ligera modificación accroding a la demanda que describe. ¡Gracias!

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="0dip" android:layout_height="64dip" android:layout_weight="1" android:layout_marginLeft="-3dip" android:layout_marginRight="-3dip" android:gravity="center" android:background="@android:drawable/tab_indicator"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:attr/tabWidgetStyle"> </TextView> </LinearLayout> 

Puede encontrar los archivos de color de resolución para cada plataforma bajo / path-to-android-sdk / plataformas / y puede usar @android: style / o @android: color / para acceder a los recursos predeterminados de XMLs …

Pero como mencionaste, eres consciente de que los colores y estilos de TabWidgets y otras vistas de interfaz de usuario de Android cambian de versión a versión y entre marcas de dispositivos.

Incluso si usted puede hacer lo que quiere hacer, sus pestañas se vería diferente entre las versiones y marcas de dispositivos … lo que no es lo habitual.

Implementaría mis propios estilos de Tab con una de las soluciones dadas. Buena suerte aunque!

  • Asignación de fragmentos a las pestañas de la barra de acciones con diferentes orientaciones
  • FragmentPagerAdapter problemas y problemas: Constructor Undefined
  • Android ActionBar Tabs color de fondo modo dividido
  • PagerSlidingTabStrip - agrega una nueva pestaña en tiempo de ejecución
  • La tecla Tab no funciona en Android Studio
  • Cambiar a otra pestaña más de una vez da EEROR
  • Cambiar las actividades mediante ActivityGroup en la pestaña (Android)
  • Cómo crear estilo tabulado de Android con la vista de desplazamiento de página
  • Cambiar entre la pestaña mediante el grupo de actividades desea mostrar la última actividad - Tab ActivityGroup
  • Mostrar iconos en las fichas FragmentPagerAdapter
  • ¿Es posible comprobar si una "TAB" específica en TabWidget está visible en la vista actual o no?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.