该方法使用setTheme方法使用不同的Theme
准备
自定义属性(attr.xml)
自定义的属性可以给控件设置属性之类的时候使用(?attr/background1), 在Theme的style里设置值
1 2 3 4 |
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="background1" format="reference"/> </resources> |
Theme需要的style(styles.xml)
切换的Theme的样式, 其中background1是自定义的属性;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<resources> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="background1">@color/colorAccent</item> </style> <style name="AppTheme2" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/colorPrimary2</item> <item name="colorPrimaryDark">@color/colorPrimaryDark2</item> <item name="colorAccent">@color/colorAccent2</item> <item name="background1">@color/colorPrimaryDark2</item> </style> </resources> |
在布局中使用自定义属性
随着在Activity的OnCreate中改变Theme, 重载页面后, 这些属性对应的值会改变, 进而改变控件
1 2 3 |
android:background="?attr/background1" |
?表明了我们引用的资源的值在当前的主题当中定义过。通过引用在
java代码中更改Theme
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class MainActivity extends AppCompatActivity { //static private static boolean isChangeTheme=false; private Button changeBt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 更改Theme, 放在OnCreate方法中, setContentView之前 // setTheme方法在其他地方不起作用 setTheme(isChangeTheme ? R.style.AppTheme : R.style.AppTheme2); setContentView(R.layout.activity_main); changeBt= (Button) findViewById(R.id.button); changeBt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { isChangeTheme = !isChangeTheme; // 主题更改, 重启界面, 回调onCreate方法 startActivity(new Intent(MainActivity.this,MainActivity.class)); finish(); overridePendingTransition(0,0); } }); } } |
主题的style
在Style中的item可以直接指定一些属性,例如
1 |
<item name="android:textColor">@color/colorPrimaryDark</item> |
设置这一个item后, 应用该主题的界面中的控件会应用该字体颜色
其他
在一个布局文件的跟容器中可以使用android:theme指定主题;
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:theme="@style/AppTheme" tools:context="comb.example.cold.switchtheme.MainActivity"> </RelativeLayout> |
0 Comments