样式和主题
Android系统中包含了很多样式和主题资源,这些样式和主题用于定义界面上的布局风格。样式是针对某个View,例如TextView和Button等控件;主题针对整个Activity界面或整个应用程序
样式
样式(style)是包含一种或多种控件的属性集合,可以指定控件高度、宽度、字体大小及颜色等。样式在XML资源文件中定义,并且可以继承、复用等。方便统一管理并减少代码量
创建一个样式,首先找到res\values\style目录下styles.xml文件
打开可以看到根标签和定义样式的<style>标签,它包含多个来声明样式名称和属性。
<style>标签中的代码是系统自带的样式,<style>标签内包含多个<item>来声明样式名称和属性,name属性是样式名称(类似于id属性),parent属性表示继承某个样式,通过<item>标签以键值对的形式定义属性和属性值。
只要把文件创建在values目录下并以“.xml”结束,文件结构代码相同,就可以自己创建样式文件,下面在系统自带的styles.xml文件中自定义属性
①自定义一个用于TextView控件的属性
<!-- 1.设置自定义style属性:宽、高、字体大小、所在位置 -->
<style name="textview">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">20sp</item>
<item name="android:layout_gravity">center</item>
</style>
②在布局文件中定义控件,设置style属性
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- 2.创建TextView,设置style属性,链接自定义属性 -->
<TextView
style="@style/textview"
android:text="文本一" />
<TextView
style="@style/textview"
android:text="文本二" />
<TextView
style="@style/textview"
android:text="文本三" />
</LinearLayout>
③运行结果
主题
主题(theme)是应用到整个Activity和Application的样式,而不只应用到单个视图。当设置好主题后,Activity或整个程序中的视图都将使用主题中的样式属性。当主题和样式中的属性发生冲突时,样式的优先级要高于主题。主题和样式的代码结构是一样的,不同处在于引用方式,主题要在AndroidManifest.xml文件中引用
在styles.xml文件中定义一个背景颜色的主题,在定义时要用parent属性去继承Theme.APPCompat.Light.DarkActionBar来保证它的兼容性,否则运行时会出现异常
①在styles.xml文件中定义属性
<!-- 1.自定义样式 -->
<style name="background_blue" parent="Theme.AppCompat.Light.DarkActionBar">
<!--设置主题背景颜色:蓝色-->
<item name="android:background">#00BFFF</item>
</style>
②在AndroidManifest.xml文件中定义android:theme属性,引用自定义的属性
android:theme="@style/background_blue"
③运行结果
字符串资源
每个项目在res/values目录下都包含一个默认字符串资源文件strings.xml,打开可以看到已经添加了默认的字符串资源
可以自己添加字符串资源
①定义字符串资源
<!--定义字符串资源-->
<resources>
<string name="app_name">My Application</string>
<string name="textview_name">姓名</string>
<string name="textview_age">年龄</string>
</resources>
②引用
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--定义组件,引用资源-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/textview_name"
android:textSize="20sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/textview_age"
android:textSize="20sp" />
</LinearLayout>
③运行结果
为什么不用android:text属性,非要这么麻烦去定义再去引用?
①这是官方规范的字符串资源定义方法
②当程序开发需要国际化时,布局中所有的资源文件只能通过amdroid:text="@string/XXX"这种方式才能生效
颜色资源
颜色资源在res/values目录下的colors.xml文件中定义,与字符串资源定义类似
第一行,version="1.0"表示xml文件的版本,encoding="utf-8"表示xml文件的编码格式;第二行在<resource>标签中定义,以<color>标签开头,定义name属性相当于id,在<color>标签中定义RGB颜色值表示颜色
自定义颜色属性:
①在颜色资源文件中定义
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#6200EE</color>
<color name="colorPrimaryDark">#3700B3</color>
<color name="colorAccent">#03DAC5</color>
<!-- 1.自定义颜色资源 -->
<color name="blue">#0000FF</color>
<color name="red">#FF0000</color>
<color name="black">#000000</color>
</resources>
②在布局文件中引用颜色资源
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 2.引用颜色资源 -->
<TextView
style="@style/textview"
android:text="文本框一"
android:textColor="@color/blue" />
<TextView
style="@style/textview"
android:text="文本框二"
android:textColor="@color/red" />
<TextView
style="@style/textview"
android:text="文本框三"
android:textColor="@color/black" />
</LinearLayout>
③运行结果