系统内建属性
比如系统有一个内建属性selectableItemBackground
,可以为可点击控件设置点击时的水波纹效果,以下几种方法都可以成功引用
// 未设置前
<Button
/>
// 设置水波纹点击效果
<Button
、、、
android:foreground="?android:attr/selectableItemBackground"/>
// 省略attr/
<Button
、、、
android:foreground="?android:selectableItemBackground"/>
// 省略android:
<Button
、、、
android:foreground="?attr/selectableItemBackground"/>
// 省略android:attr/
<Button
、、、
android:foreground="?selectableItemBackground"/>
自定义属性
我们先在attrs.xml文件中自定义一个属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
// 通过format可以设置各种不同的类型,包括style,这里不再赘述
<attr name="myTextColor" format="color"/>
</resources>
此时如果直接引用是没有效果的,而且会报错
<Button
、、、
android:textColor="?attr/myTextColor"
我们还需要在styles.xml文件中为这个自定义属性设置一个默认值,然后再引用就可以成功了,这里我们把Button的文字设置成红色
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="myTextColor">#ff0000</item>
</style>
</resources>
当然,和内建属性的引用一样,我们也可以省略掉attr/
// 省略掉attr/也是可以引用成功的
<Button
、、、
android:textColor="?myTextColor"
总结
- Android内建属性引用前面可以加
android:
,但也可以省略,自定义属性则不可以加 - 属性的引用最短可以简化成
?attribute
,建议该写法比较简短 - 属性引用引用的其实不是引用属性,而是引用该属性设置的默认值,所以自定义属性记得在主题中设置引用属性的默认值,当人也可以再主题中更改系统内建属性的默认值
更换主题
参考
有一个想法,可以通过在不同的主题中定义同一个自定义属性的不同默认值,然后通过setTheme();
方法来切换主题,马上验证下
首先在attrs.xml文件中自定义一个属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
// 通过format可以设置各种不同的类型,包括style,这里不再赘述
<attr name="myTextColor" format="color"/>
</resources>
然后在styles.xml中定义两个不同的theme
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="myTextColor">#ff0000</item>
</style>
<style name="AppThemeGreen" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="myTextColor">#00ff00</item>
</style>
本来想通过Application.setTheme();
方法来设置主题,但发现未生效,具体原因还未去深究,现在只能通过调用Activity.setTheme();
方法来设置出题,且必须在setContentView();
方法前调用,否则无法生效,可以将Activity.setTheme();
调用写在基类BaseActivity的onCreate方法里。
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setTheme(R.style.AppTheme);
// 可以有一个换肤的页面供选择,然后把选择的选择的theme保存到Sharepreference中
setTheme(R.style.AppThemeGreen);
setContentView(R.layout.activity_main);
}
总结:
- Application.setTheme()设置主题无法生效
- Activity.setTheme()设置主题需在setContentView之前调用才能生效
缺点:
1.假设有个换肤选择的Activity页面,选择后无法实时生效,需重启Activity。就是说已打开的Activity是无法马上看到效果的,新打开的Activity才能够看到换肤效果。
2.该换肤实现方式的所有主题需写死在styles.xml文件内,无法实现后台下载新皮肤。至于下载新皮肤网上有通过apk文件的方式,以后可以深入研究下。
参考
如果喜欢我的文章,可以扫描以下二维码关注我的微信公众号,我会定期发布最新的文章。