You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:01:37