一.前言
在android项目中的styles.xml主要是用来设置app的全局或者是部分Activity样式的,之前一直对这一块的xml一头雾水,所以在这里记录一下有关styles的使用方法和常用属性。
二.使用方法
首先新建一个android project,打开它的styles.xml文件,默认的xml代码如下:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">#fff</item>
</style>
</resources>
其中style:name
是定义的style的名字,在这个style的内部会有许多自定义的item,其中初始状态下的三个属性所代表的颜色区域如下图:
我们可以自己来定义自己的style,具体的定义方法和上述代码相似,只不过需要更改style的name属性:
<style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">#FA7298</item>
<item name="colorPrimaryDark">#FA7298</item>
<item name="colorAccent">#fff</item>
</style>
如果想要在布局文件中使用主题,则可以直接android:theme="@style/MyTheme"
即可。
在自定义style时,item里面的name可以是我们自定义的,也可以是android布局里面自带的属性,例如:
<style name="MyTheme2" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:textSize">20dp</item>
<item name="android:layout_width">20dp</item>
<item name="android:layout_height">20dp</item>
</style>
在MyTheme2中设定了android布局里面自带的的三种属性,所以在写布局文件的时候就不用一项一项写,直接引入style即可得到同样的效果,而且大大减少了代码量。
三.设置style
1.动态设置style
如果App想要实现切换主题的功能,则可以在activity中使用setTheme()
方法,在方法中将具体的style传进去即可来更新主题,但是需要注意的是setTheme()方法必须要在setContentView()方法之前进行调用!!!,否则会设置失效:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.MyTheme);
setContentView(R.layout.activity_main);
......
}
如果想要实现点击之后进行主题的切换,则需要在调用setTheme()
方法之后调用recreate()
方法即可,不过App画面可能会有瞬间的闪烁:
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.change:
setTheme(R.style.MyTheme);
recreate();
break;
}
}
2.静态设置theme
静态设置activity的样式也很简单,就是在AndroidManifest中给指定的activity中添加android:theme
属性即可:
<activity android:name=".MainActivity"
android:label="yzbkaka"
android:theme="@style/MyTheme">
......
四.系统自带style
Android系统中也自带的有许多的style,下面来看看比较常用的style。
@style/Theme.AppCompat.Dialog.Alert
@style/Theme.AppCompat.Light.Dialog.Alert
五.关于item的name属性
前面说道,item里面的name
一般是布局文件里面已经有的属性,比方说layout_width,layout_height
等等,但是在name里面我们也可以设置自己的属性,但是一般是用在我们的自定义View上面。
推荐阅读:https://blog.csdn.net/Ithink213/article/details/88315283