概述:
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的样式层次结构,应尽量使用主题背景和样式,以保持一致性,如果在多个位置指定了相同的属性,下表决定了最终将应用哪些属性,从最高优先级到最低优先级排序:
- 通过文本span将字符或段落级别样式应用到TextView派生类
- 以编程方式应用属性
- 将单独的属性直接应用到View
- 将样式应用到View
- 默认样式
- 将主题背景应用于View,Activity或整个应用
- 应用于某些特定于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>