首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将android资源价值链接在一起?

如何将android资源价值链接在一起?
EN

Stack Overflow用户
提问于 2018-08-11 05:19:41
回答 1查看 28关注 0票数 0

我很难找到一种模式来创建指向资源值集合的常量。假设我在布局的每个角落都有四个TextViews。然后,我有四组不同的常量内容随机分配给这四个TextViews。该内容带有文本和TextView的背景色。这些值在strings.xml和colors.xml中定义。假设strings.xml看起来像这样:

代码语言:javascript
复制
<resources>
    <string name="A">Text for A</string>
    <string name="B">Text for B</string>
    <string name="C">Text for C</string>
    <string name="D">Text for D</string>
</resources>

我的colors.xml是这样的:

代码语言:javascript
复制
<resources>
    <color name="A">#AAAAAA</color>
    <color name="B">#BBBBBB</color>
    <color name="C">#CCCCCC</color>
    <color name="D">#DDDDDD</color>
</resources>

然后,在Activity类中,我想编写一个方法,将这些值随机分配给TextViews。我可以这样做:为每种类型的值创建列表,然后从这四种值中随机挑选一个TextView,从每个列表中删除第一个值并将其分配给TextView:

代码语言:javascript
复制
List<Integer> colors = Arrays.asList(R.color.A,
                                     R.color.B,
                                     R.color.C,
                                     R.color.D);
List<String> strings = Arrays.asList(R.string.A,
                                     R.string.B,
                                     R.string.C,
                                     R.string.D);

for (int i = 4; i > 0; i--) {
    int randomNumber = // get a random number between 0 and i
    TextView tv = // get text view based on i (by switch case)
    tv.setText(string.remove(0));
    tv.setBackgroundColor(getResources().getColor(colors.remove(0));
}

这个解决方案对我来说似乎并不好,因为字符串和颜色值之间的关系乍一看并不明显。此外,它还需要编写大量代码。然后我想到了一个枚举,其中每个枚举值都有一个对其相关资源的引用。

代码语言:javascript
复制
enum TextViewContent {
    A(R.string.A, R.color.A),
    B(R.string.B, R.color.B),
    C(R.string.C, R.color.C),
    D(R.string.D, R.color.D);

    public final String string;
    public final int color;

    private TextViewContent(String string, int color) {
        this.string = string;
        this.color = color;
    }
}

这个解决方案在我看来很好,直到我看到这个页面https://android.jlelse.eu/android-performance-avoid-using-enum-on-android-326be0794dc3,在那里他们建议避免在安卓代码中使用枚举。在该页面的示例中,要避免的枚举都可以替换为一组原语类型的常量。我不确定使用枚举是否仍然是一个好主意。另一方面,我已经没有办法解决这个问题了。

在这种情况下,使用枚举是最好的解决方案吗?如果没有:这里最好的解决方案是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-11 06:32:12

以可用作数组的方式准备资源:

代码语言:javascript
复制
<string-array name="texts">
    <item>Text for A</item>
    <item>Text for B</item>
    <item>Text for C</item>
    <item>Text for D</item>
</string-array>

<color name="A">#AAAAAA</color>
<color name="B">#BBBBBB</color>
<color name="C">#CCCCCC</color>
<color name="D">#DDDDDD</color>

<integer-array name="colors">
    <item>@color/A</item>
    <item>@color/B</item>
    <item>@color/C</item>
    <item>@color/D</item>
</integer-array>

那么你要做的就是检索它们:

代码语言:javascript
复制
    String[] strings = getResources().getStringArray(R.array.texts);
    int[] colors = getResources().getIntArray(R.array.colors);

这并不是大量的编码。

它也很容易维护,因为如果您想要更改文本或颜色,或添加新项,或删除项,您只需在资源中工作。

至于字符串和颜色值之间的关系,这是非常明显的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51794155

复制
相关文章

相似问题

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