Android的theme主题中统一定义各种控件的style属性
在Android中定义一个Button的style样式,可以直接指明它的style属性即可。
但当我们的应用中所有的Button都需要使用统一的style样式时,这样做明显很麻烦,需要在每一个Button中声明style属性。
在Android SDK的在线文档中有专门一章介绍如何定义和使用Style和Theme,但是没有具体给出如何自己定义包含各种默认配置的Theme,包含窗口风格,按钮风格,字体等。一般的做法是在使用某个控件时,给定属性值或者一个Style。这种方式的缺点是,每个控件都要定义,否则就会使用Android系统默认的Theme。
参考Android系统默认的theme中对Button的style设置,我们也可以在theme中统一自定义各种控件的style属性,然后再manifest.xml应用这一theme即可,而不需逐一对每个相同的控件指明style属性。
在一个activity中需要统一设置Button,TextView等各个控件的属性时,我们可以按如下方法进行:
①、在values/styles.xml中定义两个style如下:
<!-- 该style用于设置button的背景图片及颜色 -->
<!-- btn_select_pic 和 btn_select_color都是StateList的xml文件,当Button处于不同状态时显示不同的背景图,Button上的文本显示不同的颜色 -->
<style name="btnStyle">
<item name="android:background">@drawable/btn_select_pic</item>
<item name="android:textColor">@color/btn_select_color</item>
</style>
<!-- 设置textView的背景(黑色)及文本颜色(绿色) -->
<style name="textViewStyle">
<item name="android:background">#000000</item>
<item name="android:textColor">#00ff00</item>
</style>
②、在values/styles.xml定义一个style如下:
<style name="myTheme">
<item name="android:buttonStyle">@style/btnStyle</item>
<item name="android:textViewStyle">@style/textViewStyle</item>
</style>
③、res/color/btn_select_color.xml文件的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:color="#ff000000" android:state_pressed="false"/>
<item android:color="#ffffffff" android:state_pressed="true"/>
</selector>
res/drawable/btn_select_pic.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/btn_default_normal" android:state_pressed="false" android:state_enabled="true"/>
<item android:drawable="@drawable/btn_default_selected" android:state_pressed="true"/>
<item android:drawable="@drawable/btn_default_normal" />
</selector>
③、在manifest.xml文件中使用主题myTheme:该Acticvty界面上的所有Button及TextView都将使用统一的style显示。
<activity android:name=".MainActivity" android:label="@string/app_name"
android:theme="@style/myTheme">
该activity对应的布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:gravity="center_vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button android:id="@+id/BTN_ONE"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="BTN_ONE" />
<Button android:id="@+id/toggle_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/toggle_title" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/toggle_title" />
</LinearLayout>
运行效果图如下:当Button未按下时,背景图为灰色,文本颜色为#000000,;当按钮按下时,背景图片为橘色,文本颜色为#ffffff。
开发中常用的style属性如下:
<style name="Theme.Dialog.Light" parent="@android:style/Theme.Dialog">
<item name="android:buttonStyle">@style/Button.Light</item>
<item name="android:checkboxStyle">@style/CheckBox.Light</item>
<item name="android:gridViewStyle">@style/GridView.Light</item>
<item name="android:listViewStyle">@style/ListView.Light</item>
<item name="android:textViewStyle">@style/TextView.Light</item>
<item name="android:spinnerStyle">@style/Spinner.Light</item>
<item name="android:radioButtonStyle">@style/RadioButton.Light</item>
<item name="android:editTextStyle">@style/EditText.Light</item>
<item name="android:autoCompleteTextViewStyle">@style/AutoCompleteTextView.Light</item>
<item name="android:progressBarStyle">@style/ProgressBar.Light</item>
<item name="android:spinnerDropDownItemStyle">@style/SpinnerDropDownItem.Light</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:scrollbarThumbHorizontal">@drawable/scrollbar_horizontal</item>
<item name="android:scrollbarThumbVertical">@drawable/scrollbar_vertical</item>
<item name="android:progressBarStyleHorizontal">@style/ProgressBar.Horizontal.Light</item>
<item name="android:windowTitleStyle">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFrame">@null</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<!-- others -->
</style>