我很难找到一种模式来创建指向资源值集合的常量。假设我在布局的每个角落都有四个TextViews。然后,我有四组不同的常量内容随机分配给这四个TextViews。该内容带有文本和TextView的背景色。这些值在strings.xml和colors.xml中定义。假设strings.xml看起来像这样:
<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是这样的:
<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:
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));
}
这个解决方案对我来说似乎并不好,因为字符串和颜色值之间的关系乍一看并不明显。此外,它还需要编写大量代码。然后我想到了一个枚举,其中每个枚举值都有一个对其相关资源的引用。
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,在那里他们建议避免在安卓代码中使用枚举。在该页面的示例中,要避免的枚举都可以替换为一组原语类型的常量。我不确定使用枚举是否仍然是一个好主意。另一方面,我已经没有办法解决这个问题了。
在这种情况下,使用枚举是最好的解决方案吗?如果没有:这里最好的解决方案是什么?
发布于 2018-08-11 06:32:12
以可用作数组的方式准备资源:
<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>
那么你要做的就是检索它们:
String[] strings = getResources().getStringArray(R.array.texts);
int[] colors = getResources().getIntArray(R.array.colors);
这并不是大量的编码。
它也很容易维护,因为如果您想要更改文本或颜色,或添加新项,或删除项,您只需在资源中工作。
至于字符串和颜色值之间的关系,这是非常明显的。
https://stackoverflow.com/questions/51794155
复制相似问题