首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设置自定义属性android的值

设置自定义属性android的值
EN

Stack Overflow用户
提问于 2019-06-12 19:04:30
回答 2查看 898关注 0票数 2

我有一个自定义属性,如下所示:

代码语言:javascript
运行
复制
<attr name="colorPrimarySdk" format="color"/>
<attr name="colorSecondarySdk" format="color"/>
<attr name="colorAccentSdk" format="color"/>

我在我的风格中使用它们,像这样:

代码语言:javascript
运行
复制
<style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="colorPrimary">?colorPrimarySdk</item>
     <item name="colorPrimaryDark">?colorSecondarySdk</item>
     <item name="colorAccent">?colorAccentSdk</item>
</style>

现在我想要的是从代码中动态设置属性的值,比如:

代码语言:javascript
运行
复制
colorPrimarySdk.value = myCustomColor

我已经尝试使用TypedValue并访问属性本身。如果有人可以帮助我更改自定义属性的值,那将是一个很大的帮助。提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2019-06-12 19:30:27

这很难:)

colors.xml:

代码语言:javascript
运行
复制
    <?xml version="1.0" encoding="utf-8"?>
      <resources>
      <color name="your_special_color">#FF0099CC</color>
    </resources>

Res.java:

代码语言:javascript
运行
复制
public class Res extends Resources {

    public Res(Resources original) {
        super(original.getAssets(), original.getDisplayMetrics(), original.getConfiguration());
    }

    @Override public int getColor(int id) throws NotFoundException {
        return getColor(id, null);
    }

    @Override public int getColor(int id, Theme theme) throws NotFoundException {
        switch (getResourceEntryName(id)) {
            case "your_special_color":
                // You can change the return value to an instance field that loads from SharedPreferences.
                return Color.RED; // used as an example. Change as needed.
            default:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    return super.getColor(id, theme);
                }
                return super.getColor(id);
        }
    }
}

BaseActivity.java

代码语言:javascript
运行
复制
public class BaseActivity extends AppCompatActivity {

    ...

    private Res res;

    @Override public Resources getResources() {
        if (res == null) {
            res = new Res(super.getResources());
        }
        return res;
    }

    ...

}
票数 1
EN

Stack Overflow用户

发布于 2019-06-12 19:56:56

在颜色文件中定义特定主题的颜色:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="my_link_color1">#0077CC</color>
    <color name="my_link_color2">#626262</color>
</resources>

创建包含以下内容的res/values/attrs.xml文件:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="myLinkColor" format="reference" />
</resources>

假设我们的styles.xml定义中有两个主题(Theme1和Theme2):

代码语言:javascript
运行
复制
<style name="Theme1" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="myLinkColor">@color/my_link_color1</item>
</style>

<style name="Theme2" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="myLinkColor">@color/my_link_color2</item>
</style>

在XML中使用颜色:

代码语言:javascript
运行
复制
android:textColor="?attr/myLinkColor"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56560657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档