【问题标题】:How to programmatically change the primary color in Android L?如何以编程方式更改 Android L 中的原色?
【发布时间】:2014-08-17 23:23:45
【问题描述】:

有没有办法以编程方式更改原色。我想根据应用程序的屏幕/状态在代码中执行此操作。

目前我只能在主题中设置颜色(静态):

<item name="android:colorPrimary">@color/primary_color</item>
<item name="android:colorPrimaryDark">@color/dark_color</item>
<item name="android:colorBackground">@android:color/white</item>
<item name="android:colorAccent">@color/primary_color</item>
<item name="android:colorControlHighlight">@color/primary_color</item>

【问题讨论】:

    标签: android android-5.0-lollipop


    【解决方案1】:

    当然,您可以实现 View 的自定义子类,这些子类具有设置颜色的方法。

    您还可以使用各种配色方案定义多个主题。

    Views 在创建主题时从上下文中查找主题信息。因此,要更改从主题应用的样式,您必须使用使用正确主题的上下文重新创建视图层次结构。

    这样做的一种方法是创建一个新的ContextThemeWrapper,然后获取一个使用该主题包装器的 LayoutInflator,删除旧版本的布局并重新膨胀您的布局。

    大致:

    ContextThemeWrapper themeWrapper = new ContextThemeWrapper(this, R.style.AppThemeWithColorScheme2);
    LayoutInflater layoutInflater = LayoutInflater.from(themeWrapper);
    viewContainer.removeAllViews();
    layoutInflater.inflate(R.layout.my_layout, viewContainer, true );
    

    如果您使用的是 Action Bar,那可能会有点棘手,因为 Action Bar 是由 once per activity 创建的。

    【讨论】:

    • 谢谢,在我的用例中重新创建活动不是问题。所以我结束了在 style.xml 中编写所有主题,它们之间的唯一区别是颜色。我会看看是否可以使用 ContextThemeWrapper 进行改进。
    【解决方案2】:

    使用此代码设置工具栏颜色和状态栏(工具栏颜色较深)

    toolbar.setBackgroundColor(toolbarColor);
    factor=0.8f; 
    int a = Color.alpha(toolbarcolor);
    int r = Math.round(Color.red(toolbarcolor) * factor);
    int g = Math.round(Color.green(toolbarcolor) * factor);
    int b = Math.round(Color.blue(toolbarcolor) * factor);
    int statusColor=Color.argb(a,
            Math.min(r, 255),
            Math.min(g, 255),
            Math.min(b, 255));
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = MainActivity.this.getWindow();
        window.setStatusBarColor(statusColor);
    }
    

    【讨论】:

    • 欢迎堆栈溢出。虽然这确实是一种更改一些颜色的程序化方法,但它不是更改应用程序主色无处不在的通用方法;也就是说,在使用它的任何地方动态更改主题的颜色。
    【解决方案3】:

    这个最实用,没有报错,不需要额外编码,直接去android tree project

    res > values > colors 然后编辑这些代码:

     <resources>
        <color name="colorPrimary">#008577</color>
        <color name="colorPrimaryDark">#00574B</color>
        <color name="colorAccent">#D81B60</color>
    </resources>
    

    在样式下添加这些:

    <style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    </style>
    

    在“.MainActivity”之后添加到清单中:

    android:theme="@style/AppTheme.NoActionBar">
    

    【讨论】:

    • 欢迎堆栈溢出。问题询问如何以编程方式 更改这些颜色。这意味着,在运行时在 code 中更改它们。
    【解决方案4】:

    这会改变文本中的所有内容

    <item name="android:textColorPrimary">@color/textGrey</item>
        <item name="android:textColorSecondary">@color/textGrey</item>
        <item name="android:textColorTertiary">@color/textGrey</item>
        <item name="android:listDivider">@color/textGrey</item>
    

    【讨论】:

    • 欢迎堆栈溢出。该问题询问如何以编程方式 更改这些颜色。这意味着,在运行时在 code 中更改它们。
    猜你喜欢
    • 1970-01-01
    • 2021-10-05
    • 2017-05-16
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多