切换主题常见大概有三种方式,我这里用最简单的一种来实践。如下:
使用重启Activity来加载主题 新建attrs.xml新建values/attrs.xml来实现我们切换主题需要改变的属性比如:
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="btnBgColor" format="color"/> <attr name="btnTxColor" format="color"/> </resources>这里新建了两个属性来改变Button的文字颜色和背景颜色
新建style在values/styles.xml中新建两个主题样式
<!-- 日间 --> <style name="AppTheme_Light" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!-- Button文字为黑色 --> <item name="btnTxColor">#000000</item> <!-- Button文字为白色--> <item name="btnBgColor">#ffffff</item> </style> <!-- 夜间 --> <style name="AppTheme_Night" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!-- Button文字为白色 --> <item name="btnTxColor">#ffffff</item> <!-- Button文字为黑色 -->![这里写图片描述]() <item name="btnBgColor">#000000</item> </style>这里没什么不同的,就是在日间主题里Button 的文字颜色为黑色 背景为白色,而夜间模式则相反,其他都是一样,主要为了颜色效果,至于其他的属性,以及继承的主题完全可以自己定义即可。
此时在AndroidManifest.xml 文件里指定默认主题为 日间模式 如下:
activity_layout.xml代码如下:
<?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" tools:context="me.jinkun.changetheme.MainActivity"> <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/btnBgColor" android:text="切换主题" android:textColor="?attr/btnTxColor"/> </RelativeLayout>注意Button里的Android:background=”?attr/btnBgColor” 和 android:textColor=”?attr/btnTxColor” 会引用我们在主题里设置的对应的btnBgColor和btnTxColor对应的值。
MainActivity.Java代码如下:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 用sp来获取当前是显示的哪个主题 final SharedPreferences sp = getSharedPreferences("config", Context.MODE_PRIVATE); final int theme = sp.getInt("theme", 0); if (theme == 0) { setTheme(R.style.AppTheme_Light); } else { setTheme(R.style.AppTheme_Night); } setContentView(R.layout.activity_main); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //用sp来保存当前是显示的哪个主题 sp.edit().putInt("theme", theme == 0 ? 1 : 0).commit(); recreate(); } }); } }