有没有办法在应用程序级别覆盖 Android 的平台属性值?

Is there a way to override Android's platform attribute value at the app level?

我有一个自定义 viewholder class,它从构造函数中 android 命名空间中的属性获取颜色:

int mDefaultPrimaryColor = GetColor(context, android.R.attr.colorPrimary);

....

public static int getColor(Context context, int attr)
{
    TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
    int color = ta.getColor(0, 0);
    ta.recycle();
    return color;
}

稍后绑定方法最终设置颜色:

someTextView.setTextColor(mDefaultPrimaryColor);

我想通过 XML 覆盖我应用程序中的 android.R.attr.colorPrimary 值而不修改 Java 代码,以便该值与 SDK 中设置的值不同。

我试图在 themes.xml 中覆盖此值:

<resources>
   <style name="MyAppTheme" parent="@android:Theme.DeviceDefault.NoActionBar">
       <item name="android:colorPrimary">@color/my_color</item>
   </style>
</resources>

但是,我在 Android 模拟器中看到的颜色不是我为 my_color 设置的颜色。有没有办法用我在我的应用程序中定义的颜色覆盖 android.R.attr.colorPrimary?我做错了什么?

编辑:主题已在清单文件中设置。更新了代码片段以使其更准确。

您可以使用更改的属性值创建一个单独的主题,然后将主题传递给将 ContextThemeWrapper(context, R.style.new_theme) 作为上下文传递的视图。

查看文档: https://developer.android.com/reference/android/view/ContextThemeWrapper

UPD: 确实可以像您尝试的那样在主题中设置 colorPrimary。您需要添加

<application
    ...
    android:theme="@style/MyAppTheme"
    ...

至AndroidManifest.xml。

您的代码还不够完整,无法获取颜色代码。试试这个:

// Extract the color attribute we are interested in.
TypedArray a = context.obtainStyledAttributes(new int[]{android.R.attr.colorPrimary});
// From the TypedArray retrive the value we want and default if it is not found.
int defaultColor = a.getColor(0, 0xFFFFFF);
// Make sure to recycle the TypedArray.
a.recycle();

现在在您的 theme/style 中,您可以指定如下内容:

<item name="android:colorPrimary">@android:color/holo_blue_light</item>

这是

<!-- A light Holo shade of blue. Equivalent to #ff33b5e5. -->
<color name="holo_blue_light">#ff33b5e5</color>

当然,您必须根据需要应用此颜色。