一手遮天 Android - UI: 自定义主题,动态更换主题
示例如下:
/ui/ThemeDemo2.java
/**
* 自定义主题,动态更换主题
*
*
* 自定义的可根据主题来决定样式的属性的定义参见 res/values/attrs.xml
* 自定义的主题参见 res/values/styles.xml
*
*
* 自定义主题以及动态更换主题的说明
* 1、在 attrs.xml 中定义属性的名字和类型
* 2、在 styles.xml 中定义主题,设置在 attrs.xml 中定义的属性的样式
* 3、在 activity 的 xml 中,将需要跟随主题变化的属性的值设置为在 attrs.xml 中定义的属性
* 4、通过 setTheme() 指定主题,需要在 setContentView() 前指定才会生效
*/
package com.webabcd.androiddemo.ui;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.webabcd.androiddemo.R;
public class ThemeDemo2 extends AppCompatActivity {
static int _themeResourceId = R.style.ThemeDemo2Theme1;
private TextView _textView1;
private Button _button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 指定 activity 的主题(需要在 setContentView() 之前)
setTheme(_themeResourceId);
// 指定 application 级别的主题
// getApplication().setTheme(_themeResourceId);
setContentView(R.layout.activity_ui_themedemo2);
_textView1 = findViewById(R.id.textView1);
_button1 = findViewById(R.id.button1);
sample();
}
private void sample(){
_button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (_themeResourceId == R.style.ThemeDemo2Theme1) {
_themeResourceId = R.style.ThemeDemo2Theme2;
} else {
_themeResourceId = R.style.ThemeDemo2Theme1;
}
// 重新创建此 activity 以便更换后的主题生效
recreate();
}
});
}
}
/layout/activity_ui_themedemo2.xml
<?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">
<!--
textColor 和 background 的值的定义来自 res/values/attrs.xml
主题定义来自 res/values/styles.xml
-->
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="32dp"
android:text="我是 TextView"
android:textColor="?attr/myTitleColor"
android:background="?attr/myTitleBackgroundColor"/>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="更换主题" />
</LinearLayout>