若是咱们常常须要对某个类型的组件指定大体类似的格式,好比字体、颜色、背景色等,若是每次都对view组件重复设置这些属性,这无疑增大了工做量,并且不利于项目的后期维护。css
其实android里面的style有点相似css,若是有网站开发经验的同窗,来理解style来讲,是比较好理解的。java
样式资源android
Android的样式资源文件也放在/res/values目录下,样式资源文件的根元素是<resource.../>元素,并且在<resource../>中又能够包括多个<style.../>子元素,每一个<style../>元素定义一个样式。style元素定义有如下属性:
app
name : 指定样式的名称 parent :指定样式所继承的父样式,当继承某个父样式时,该样式将具备父样式中定义的全部格式。固然,当前样式也能够覆盖父样式中的格式。
<style.../>元素内能够包含多个<item.../>子元素,每一个<item.../>子元素定义一个格式项
例如以下实例: ide
<?xml version="1.0" encodig="utf-8"?> <resource> <style name="style1"> <item name="android:textSize">20sp</item> <item name="android:textColor">#00d</item> </style> <style name="style2" parent="style1"> <item name="android:background">#ee6</item> <item name="android:padding">8dp</item> <!--覆盖父样式中指定的属性--> <item name="android:textColor">#000</item> </style> </resource>
上面的样式资源中定义了两个样式,其中第二个样式继承了第一个样式,并且第二个样式中的textColor属性覆盖了父样式中的textColor属性。布局
一旦定义了上面的样式资源后,接下来就能够在XML资源中按照以下语法格式来使用样式了:字体
@[<package_name>]style/file_name
下面是该实例中的界面布局文件,该布局文件中包含两个文本框,这两个文本框分别使用两个样式。网站
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/style1" android:text="@string/style1"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/style2" android:text="@string/style2"/> </LinearLayout>
上面的界面布局文件中,并未为两个文本框指定恩和格式,只是为他们分别指定了使用style1.style2的样式,这两个样式包含的格式就会应用到这两个文本框。spa
主题资源code
与样式资源很是类似,主题资源xml文件一般也放在res/values目录下,主题资源的XML文档一样以<resource.../>元素做为根元素,一样使用<style.../>元素来定义主题。
主题和样式的区别体如今:
主题不能做用于单个的View组件,主体应该对整个应用综的全部Activity起做用,或对指定的Activity起做用
主题定义的格式应该是改变窗口外观的格式,例如窗口标题。窗口边框等
实例:给全部窗口添加边框、背景
下面经过一个实例来介绍主题的用法。为了给全部窗口添加边框、背景、先在/res/values/my_style.xml文件中添加一个主题,定义主体的<style.../>片断以下:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="Crazy_theme"> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">true</item> <item name="android:windowFrame">@drawable/abc_btn_check_material</item> <item name="android:windowBackground">@drawable/abc_btn_check_to_on_mtrl_015</item> </style> </resources>
定义了上面的主题以后,接下来就能够在Java代码中使用这个主题了,例如
public class MainActivity extends Activity{ private ListView listView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(R.style.Crazy_theme); setContentView(R.layout.activity_main); } }
大部分时候,在AndroidManifest.xml文件中对指定应用、Activity应用主题更加简单。若是咱们想让应用的所有窗体使用该主题,只要为<application.../>元素添加android:theme属性,属性值是一个主题的名字,以下代码所示:
<application android:theme="@style/CrazyitTheme"> ... </application>
若是你指向让程序中的某个activity拥有这个主题,那么你能够修改成<activity.../>元素,一样android:theme指定主题便可。
本应用在AndroidManifest.xml文件的<application../>元素中添加了android:theme="@style/CrazyTheme"属性。
Android中提供了几种内置的主题资源,这些主题经过查询Android.R.style类能够看到。
与样式相似的是,Android主题一样支持继承。若是开发过程当中还想利用某个主题,但须要对他进行局部修改,则可经过继承系统主题来实现自定义主题。例如以下代码片断:
<style name="CrazyTheme" parent="@android:style/Theme.Dialog"> ... </style>
上面定义的CrazyTheme主题继承了android.R.style.Theme.Dialog主题,那么接下来在该<style.../>元素中添加的<item.../>子元素可覆盖系统主题的部分属性了