不是所有视图的不同主题样式

时间:2017-01-24 19:52:05

标签: android android-theme android-styles

在我的Android应用程序中,我有两个不同的主题(浅色和深色)。 例如:

<style name="AppThemeDark" parent="Theme.AppCompat">
        <item name="colorPrimary">@android:color/black</item>
        <item name="colorPrimaryDark">@android:color/black</item>
        <item name="colorAccent">@android:color/holo_red_dark</item>
        <item name="android:textColor">@android:color/white</item>
        <item name="windowActionModeOverlay">true</item>
</style>

<style name="AppThemeLight" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="windowActionModeOverlay">true</item>
</style>

所以,现在我可以将不同的文本颜色应用到TextView(白色代表黑色主题,黑色代表光照):

<item name="android:textViewStyle">@style/TextViewDark</item>

<style name="TextViewDark">
        <item name="android:textColor">?android:attr/colorAccent</item>
</style>

但它适用于所有 TextViews。

主要问题是,有可能在下一步使用XML(非编程):

灯光主题:TextViews的一半文字颜色为黑色,另一半为绿色。 黑色主题:在Light主题中为黑色的TextViews - 红色,另一半为蓝色(在Light主题中为绿色)。

2 个答案:

答案 0 :(得分:0)

您已在styles.xml

中定义
<style name="TextViewDark">
    <item name="android:textColor">?android:attr/colorAccent</item>
</style>

<style name="TextViewLight">
    <item name="android:textColor">@color/green</item>
</style>

然后您可以在main.xml

中使用它
<LinearLayout>

    <TextView
        android:id="@+id/light_text_view"
        android:text"i´m use light theme"
        style="@style/TextViewLight"/>

    <TextView
        android:id="@+id/dark_text_view"
        android:text"i´m use darktheme"
        style="@style/TextViewDark"/>

</LinearLayout>

您无需在AppThemes

中定义样式

答案 1 :(得分:0)

创建2个类扩展TextView

public class OneTextView extends TextView {

    public OneTextView(Context context) {
        super(context);
        init(context);
    }

    public OneTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public OneTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context){
        int[] attrs = new int[] { R.attr.myFirstColor}; 
        TypedArray ta = context.obtainStyledAttributes(attrs); 
        int appColor = ta.getColor(0, 0); 
        ta.recycle();

        // set theme color
        setTextColor(appColor);
    }
}

public class SecondTextView extends TextView {

    public SecondTextView(Context context) {
        super(context);
        init(context);
    }

    public SecondTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public SecondTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context){
        int[] attrs = new int[] { R.attr.mySecondColor}; 
        TypedArray ta = context.obtainStyledAttributes(attrs); 
        int appColor = ta.getColor(0, 0); 
        ta.recycle();

        // set theme color
        setTextColor(appColor);
    }
}

您可以在xml中使用的每个类

<com.route.to.class.OneTextView
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

OneTextView可以有黑色和红色

SecondTextView可以有绿色和蓝色

attr.xml

中定义values
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="myFirstColor" format="color" />
    <attr name="mySecondColor" format="color" />
</resources>

然后在styles.xml中,为每个主题定义颜色:

<style name="Theme.MyApp" parent="@style/Theme.Light">
   <item name="myFirstColor">@color/black</item>
   <item name="mySecondColor">@color/green</item>
</style>

<style name="Theme.MyApp.Dark" parent="@style/Theme.Dark">
   <item name="myFirstColor">@color/green</item>
   <item name="mySecondColor">@color/blue</item>
</style>