Theme和Style的使用及优先级

3,313 阅读2分钟

概述:

Android开发中,我们经常需要为APP和Activity设置Theme,为TextView,EditText,Button等各种控件设置style和各种configuration等。

有时候我们的主module使用了自己的Theme,引用的第三方也有自己的界面,也为控件设置了Style模式,那么相互之间会不会产生冲突,如何避免UI变的混乱。

使用实例:

Theme的使用:

在主module的AndroidManifest文件中配置Theme属性。

<application
    ···
    android:theme="@style/Theme.AppCompat.DayNight.NoActionBar.MyAppTheme">

    <activity 
        ···
        android:theme="@style/Theme.AppCompat.DayNight.NoActionBar.MyActivityTheme">
    </activity>
</application>

在values文件夹下面配置对应的style文件例如styles.xml和basic_styles.xml:

styles.xml:

<resources>
    <style name="Theme.AppCompat.DayNight.NoActionBar.MyAppTheme">
        //将此样式应用于所有的输入框,可以在主题背景的editTextStyle中声明该样式
        <item name="editTextStyle">@style/Base.Widget.AppCompat.EditText.MyMainEditTextStyle</item>
        <item name="android:editTextStyle">@style/base.Widget.AppCompat.EditText.MyMainEditTextStyle</item> 
    </style>

    <style name="Theme.AppCompat.DayNight.NoActionBar.MyActivityTheme">
        <item name="buttonStyle">@style/Base.TextAppearance.AppCompat.Widget.Button.MyButtonStyle</item>
        <item name="android:buttonStyle">@style/Base.TextAppearance.AppCompat.Widget.Button.MyButtonStyle</item>
    </style>
</resources>

basic_styles.xml:

<resources>
    <style name="Base.Widget.AppCompat.EditText.MyMainEditTextStyle">
        <item name="android:background">@android:color/white</item>
        <item name="android:paddingLeft">10dp</item>
        <item name="android:textSize">18sp</item>
    </style>

    <style name="Base.Widget.AppCompat.Button.MyMainButtonStyle">
        <item name="android:textSize">20sp</item>
        <item name="background">@android:color/holo_blue_bright</item>
    </style>
</resources>

Style的使用:

在布局文件中为具体的某个控件添加style配置。

<EditText
    style="@style/Base.Widget.AppCompat.EditText.MyEditTextStyle"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:hint="请输入手机号">

third_styles.xml

<resources>
    <style>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:textColorHint">@android:color/black</item>
    </style>
</resources>

注意某些属性是某些widget所独有的,有些是共有的。

background是属于ActionBar下的属性

android:background是属于View下的属性

声明item时,注意所选择的属性是否合适和正确

优先级:

在选择如何为应用设置样式时,应注意Android的样式层次结构,应尽量使用主题背景和样式,以保持一致性,如果在多个位置指定了相同的属性,下表决定了最终将应用哪些属性,从最高优先级到最低优先级排序:

  1. 通过文本span将字符或段落级别样式应用到TextView派生类
  2. 以编程方式应用属性
  3. 将单独的属性直接应用到View
  4. 将样式应用到View
  5. 默认样式
  6. 将主题背景应用于View,Activity或整个应用
  7. 应用于某些特定于View的样式,例如在TextView上设置TextAppearance

主module与三方库中都使用了Style,导致UI混乱

Activity:

如果第三方库的界面展示的是Activity,可以为该Activity设置单独的Theme,

Fragment:

如果三方库中的界面展示的是Fragment,???

为自定义View设置style

<declare-styleable name="InlineEditTextView">    
    <attr name="gravity">        
        <flag name="bottom" value="80" />        
        <flag name="center" value="17" />        
        <flag name="center_horizontal" value="1" />        
        <flag name="center_vertical" value="16" />        
        <flag name="clip_horizontal" value="8" />        
        <flag name="clip_vertical" value="128" />        
        <flag name="end" value="8388613" />        
        <flag name="fill" value="119" />        
        <flag name="fill_horizontal" value="7" />        
        <flag name="fill_vertical" value="112" />        
        <flag name="left" value="3" />        
        <flag name="right" value="5" />        
        <flag name="start" value="8388611" />        
        <flag name="top" value="48" />    
    </attr>
</declare-styleable>

参考文章:

developer.android.google.cn/guide/topic…