2011-06-08 11 views
14

Tengo dificultades para descubrir cómo implementar una situación de Tema/Estilo más compleja en android.Temas de Android: defina colores/degradados en "baseTheme.xml", utilícelo dentro de los controles, anule en "subThemeX.xml"

He estudiado los diferentes tutoriales de Styling/Theming proporcionados por Android, pero no encajan en mi caso.

El (destilada) la situación es la siguiente: Estoy creando una aplicación con una TabWidget encargo, y tengo que ser capaz de marca la aplicación con diferentes estilos (temas).

El XML para la TabWidget (Basado en http://joshclemm.com/blog/?p=136):

diseño/tabs_bg.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/tabsLayout" android:layout_width="fill_parent" 
    android:layout_height="fill_parent" android:background="@drawable/tab_bg_selector" 
    android:padding="10dip" android:gravity="center" android:orientation="vertical"> 

    <LinearLayout android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:orientation="horizontal" 
     android:gravity="center"> 
     <ImageView   
      android:src="@drawable/star_fav_empty" 
      android:layout_height="24px" 
      android:layout_width="24px" 
      android:id="@+id/tabsImage" 
      android:paddingRight="5dip"></ImageView> 

     <TextView 
      android:id="@+id/tabsText" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Hallowaaaaa" 
      android:textSize="15dip" 
      android:textColor="?android:textColorTertiary"/> 
    </LinearLayout> 
</LinearLayout> 

dibujable/tab_bg_selector.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- Active tab --> 
    <item android:state_selected="true" android:state_focused="false" 
     android:state_pressed="false" android:drawable="@drawable/tab_bg_selected" /> 
    <!-- Inactive tab --> 
    <item android:state_selected="false" android:state_focused="false" 
     android:state_pressed="false" android:drawable="@drawable/tab_bg_unselected" /> 
    <!-- Pressed tab --> 
    <item android:state_pressed="true" android:state_enabled="false" android:drawable="@android:color/transparent" /> 
    <!-- Selected tab (using d-pad) --> 
    <item android:state_focused="true" android:state_selected="true" 
     android:state_pressed="false" android:drawable="@android:color/transparent" /> 
</selector> 

drawable/tab_bg_selected.xml:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <gradient android:startColor="#A8A8A8" android:centerColor="#7F7F7F" 
     android:endColor="#696969" android:angle="-90" /> 
</shape> 

estirable/tab_bg_unselected.xml:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <gradient android:startColor="#5C5C5C" android:centerColor="#424242" 
     android:endColor="#222222" android:angle="-90" /> 
</shape> 

Entonces, me gustaría definir estilos de la siguiente manera:

valores/MyBaseStyle.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="MyBaseStyle" parent="@android:style/Theme.Light"> 
    </style>  
</resources> 

valores/MySubStyle1.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="MySubStyle1" parent="MyBaseStyle"> 
    </style> 
</resources> 

valores/MySubStyle2.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="MySubStyle2" parent="MyBaseStyle"> 
    </style> 
</resources> 

Las grandes preguntas aquí son:

1. ¿Cómo puedo poner un degradado o un color en MyBaseStyle.xml, y úselo dentro de tab_bg_selected.xml y tab_bg_unselected.xml en lugar del degradado/color codificado?

2. ¿Cómo puedo anular el gradiente/color que se define en MyBaseStyle.xml desde dentro MySubStyle1.xml y MySubStyle2.xml respectivamente, de modo que mi TabWidget encargo se labró en consecuencia?

Observación: Realmente me gustaría ser capaz de definir el gradiente/colores en MyBaseStyle.xml respectivamente, MySubStyle1.xml y MySubStyle2.xml (en contraposición a la definición de múltiples colores diferentes dentro de múltiples XMLfiles diferentes) para poder para mantener el "estilo" dentro de un archivo. De esa manera, puedo externalizar la marca de mi aplicación.

¿Alguien puede ayudarme a lograr esto?

Respuesta

1

En el colors.xml en/res/valores Definición de los colores para cada tema

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="themeB_textColor">#e8e8e8</color> 
    <color name="themeA_textColor">#fff</color> 
</resources> 

A continuación, ajuste de color para las vistas mediante programación para el tema dado?

//at on create grab the selected theme however it has been set - ie: through preferences 
if(theme=='themeA') 
{ 
    super.setTheme(R.style.ThemeA); 
    Color textColor = getResources().getColor(R.color.themeA_textColor); 
} 
//later 
applyTextColors(textView1,textView2...) 

//make a function for applying colors 
public void applyTextColors(TextView... tvs) 
{ 
    for(TextView tv : tvs){tv.setTextColor(textColor);} 
} 
Cuestiones relacionadas