2017-01-10 3 views
0

Ich versuche, meinen Kopf um Stile und Themen zu wickeln. Im Moment habe ich ein einziges Thema in meiner App:Wie verwendet man bestimmte Stile mit bestimmten Themen?

<style name="WhiteTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    ... 
</style> 

Ich habe auch viele Stile für verschiedene Ansichten, wie folgt aus:

<style name="BodyText" parent="TextAppearance.AppCompat.Body1"> 
    <item name="android:textSize">14sp</item> 
    <item name="android:textColor">@color/default_text_color</item> 
</style> 

..., die ich wie folgt verwenden:

<TextView 
    ... 
    android:textAppearance="@style/BodyText"/> 

Nun, wenn ich ein neues Thema erstellen würde, sagen wir DarkTheme, wie würde ich sicherstellen, dass alle TextViews, die auf BodyText verweisen, als ihr TextAppearance auf den neuen Stil zeigen würden?

Antwort

1

Eine attr für die Ressource verwenden, würden Sie über Themen anders haben wollen.

<attr name="someTextColor" format="color"/> 

Jetzt in Ihrem Themen definieren die attrs

<style name="WhiteTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="someTextColor">@android:color/black</item> 
</style> 

<style name="DarkTheme" parent="Theme.AppCompat"> 
    <item name="someTextColor">@android:color/white</item> 
</style> 

Jetzt können Sie sie verwenden.

<style name="BodyText" parent="TextAppearance.AppCompat.Body1"> 
    <item name="android:textSize">14sp</item> 
    <item name="android:textColor">?attr/someTextColor</item> 
</style> 

Sie können auch die attr von Code erhalten

/** 
* Returns color for attr from the {@link Theme} 
* 
* @param theme {@link Theme} to get int from 
* @param attr Attribute of the int 
* @return dimension for attr from the {@link Theme} 
*/ 
@ColorInt 
public static int getColor(@NonNull final Theme theme, @AttrRes final int attr) { 
    final TypedArray array = theme.obtainStyledAttributes(new int[]{attr}); 
    try { 
     return array.getColor(0, Color.TRANSPARENT); 
    } finally { 
     array.recycle(); 
    } 
} 

Oder wie ColorStateList

/** 
* Returns {@link ColorStateList} for attr from the {@link Theme} 
* 
* @param theme {@link Theme} to get int from 
* @param attr Attribute of the int 
* @return dimension for attr from the {@link Theme} 
*/ 
@Nullable 
public static ColorStateList getColorStateList(@NonNull final Theme theme, 
     @AttrRes final int attr) { 
    final TypedArray array = theme.obtainStyledAttributes(new int[]{attr}); 
    try { 
     return array.getColorStateList(0); 
    } finally { 
     array.recycle(); 
    } 
} 

Dann

final int someTextColor = getColor(getTheme(), R.attr.someTextColor); 
// or 
final ColorStateList someTextColor = getColorStateList(getTheme(), R.attr.someTextColor); 
+0

Vielen Dank! Das war genau das, wonach ich suchte. – manabreak

0

Theme für Textview

<style name="Theme1" parent="Theme.AppCompat.Light.DarkActionBar" > 
     <item name="android:textColor">@color/colorAccent</item> 
     <item name="android:shadowDy">1</item> 
     <item name="android:shadowRadius">0.7</item> 
     <item name="android:textAppearance">@style/MyRedTextAppearance</item> 
    </style> 

    <style name="MyRedTextAppearance" > 
     <item name="android:textColor">@color/colorAccent</item> 
     <item name="android:shadowDy">1</item> 
     <item name="android:shadowRadius">0.7</item> 
    </style> 


    <style name="Theme2" parent="Theme.AppCompat.Light.Dialog" > 
     <item name="android:textColor">@color/colorPrimaryDark</item> 
     <item name="android:shadowDy">1</item> 
     <item name="android:shadowRadius">0.7</item> 
     <item name="android:textAppearance">@style/MyBlueTextAppearance</item> 
    </style> 

    <style name="MyBlueTextAppearance" > 
     <item name="android:textColor">@color/colorPrimary</item> 
     <item name="android:shadowDy">1</item> 
     <item name="android:shadowRadius">0.7</item> 
    </style> 

Textviews, die

<TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     style="@style/Theme1" 
     android:text="Dummy"/> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Dummy" 
     style="@style/Theme2"/> 
+0

Sie die Frage nicht beantworten. Wie lege ich den 'BodyText'-Stil für' WhiteTheme' und einen anderen Stil für 'DarkTheme' fest? – manabreak

+0

Danke für die Bearbeitung. Es gibt jedoch immer noch keine Antwort auf die Verwendung verschiedener Textansichtstile. AFAIK, ändert sich der Standardstil für alle TextViews? Was ist, wenn ich, sagen wir, ein Dutzend verschiedene TextView-Stile habe, die ich zusammen mit dem Thema ändern möchte? – manabreak

+0

Sie können Stile für tetxview haben –

Verwandte Themen