¿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)
.
- ¿Es posible establecer el agente de usuario en Chrometab en android
- Icono de la barra de acciones de Android png dimensions
- Función de parada que llama en pestañas
- Creación de botones de pestaña personalizados
- Comportamiento de desplazamiento de AppBarLayout
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?
- Android ActionBar.Tab setCustomView () no cumple fill_parent
- Aplicación de Android con ActionBar NullPointerException con configuración regional no predeterminada
- ¿Cómo detener títulos en las pestañas de Android de envolver en el medio de una palabra?
- Número de pestañas en ActionBar
- ¿Cuál es la altura predeterminada en Androids TabLayout
- Activar / Desactivar ficha en ActionBar
- El contenido de Tabhost no se muestra cuando actualizo android.support.v4
- Comparando La compatibilidad de la barra de acción de Android, el buscapersonas y las pestañas de muestra a ActionBarSherlock
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á:
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!
- Agrupa las trazas de pila de Java / Android en cubos únicos
- ¿Qué pasa si devuelve false en OnCreate de ContentProvider?