如何在Java中以编程方式重写AppTheme的colorPrimary与colorAccent
如何在Java代码中动态修改AppTheme的colorPrimary和colorAccent属性
如果你不想折腾多个style.xml文件,只想用Java代码直接修改AppTheme里的colorPrimary和colorAccent属性,刚好你用的是AppCompat主题,这个需求很好实现,下面是两种场景的具体方案:
1. 单Activity内修改(最常用)
要让修改后的颜色生效,关键是要在super.onCreate(savedInstanceState)之前修改主题,这样系统初始化UI组件时会直接用新的颜色值:
import android.graphics.Color; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { // 获取当前Activity的主题实例 android.content.res.Theme activityTheme = getTheme(); // 把colorPrimary从#2196F3改成红色#FF0000 activityTheme.setValue(R.attr.colorPrimary, Color.parseColor("#FF0000")); // 把colorAccent从#FF4081改成绿色#00FF00 activityTheme.setValue(R.attr.colorAccent, Color.parseColor("#00FF00")); // 一定要在修改主题后再调用super.onCreate super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
注意事项:
- 必须先修改主题再调用
super.onCreate,不然原主题已经初始化了UI,修改不会生效。 - 如果你需要兼容API 29以下的设备,可以用更稳妥的兼容写法:
import android.content.res.TypedValue; // 兼容低版本的写法 TypedValue tempValue = new TypedValue(); // 先解析原属性(可选步骤,主要是确保属性存在) getTheme().resolveAttribute(R.attr.colorPrimary, tempValue, true); // 设置新颜色 getTheme().setValue(R.attr.colorPrimary, Color.parseColor("#FF0000")); - 确保你的Activity继承自
AppCompatActivity,否则AppCompat主题的属性无法被正确识别。
2. 全局应用内修改(所有Activity生效)
如果想让整个App的所有页面都用修改后的颜色,可以在自定义Application类里设置:
import android.app.Application; import android.graphics.Color; public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); // 修改全局主题的colorPrimary和colorAccent getTheme().setValue(R.attr.colorPrimary, Color.parseColor("#FF0000")); getTheme().setValue(R.attr.colorAccent, Color.parseColor("#00FF00")); } }
注意:
- 记得在
AndroidManifest.xml里把application标签的android:name指向你的自定义MyApp类。 - 这种全局修改会影响所有使用AppCompat主题的Activity,如果某个Activity需要特殊颜色,还是要在该Activity内单独覆盖主题属性。
原理说明
AppCompat主题的colorPrimary、colorAccent这些属性都是动态可配置的,通过Theme.setValue()方法,我们可以直接覆盖xml中定义的初始值,完全不需要额外创建style文件,完美符合你的需求。
内容的提问来源于stack exchange,提问作者dev_android
相关产品推荐
相关产品推荐

