Android中能否动态拼接字符串资源名称并获取对应资源?
如何在Android中动态获取对应索引的字符串资源?
当然可以实现你想要的这种动态匹配字符串资源的效果!你原来的写法s = getResources().getString(R.string.("text" + i))没法直接工作,因为R.string下的资源都是编译时生成的静态常量,不能通过字符串拼接直接引用。不过有两种常用的方法可以解决这个问题:
方法一:使用getIdentifier()动态获取资源ID
Android的Resources类提供了getIdentifier()方法,能通过资源名称、类型和应用包名来获取对应的资源ID,之后再用getString()获取字符串。需要注意的是,循环中的i要改成有效final的变量(比如用final int index = i),因为匿名内部类只能访问外部的final或有效final变量。
修改后的代码示例:
String s; for(int i=0; i<=3; i++){ final int index = i; // 转为有效final变量 buttons[index].setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 动态获取资源ID:资源名是"text"+index,类型是"string",包名可通过getPackageName()获取 int resId = getResources().getIdentifier("text" + index, "string", getPackageName()); if (resId != 0) { // 检查资源是否存在,避免找不到资源报错 s = getResources().getString(resId); buttons[index].setText(s); } else { // 可选:资源不存在时的 fallback 逻辑 s = "默认文本"; buttons[index].setText(s); } } }); }
方法二:使用字符串数组(推荐)
这种方法更高效且类型安全,因为getIdentifier()会有一定的性能开销(需要反射查找资源)。我们可以在res/values/strings.xml中定义一个字符串数组:
<string-array name="text_array"> <item>@string/text0</item> <item>@string/text1</item> <item>@string/text2</item> <item>@string/text3</item> </string-array>
然后在代码中直接获取数组并按索引取值:
// 先获取字符串数组 String[] textArray = getResources().getStringArray(R.array.text_array); for(int i=0; i<=3; i++){ final int index = i; buttons[index].setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (index >=0 && index < textArray.length) { // 防止数组越界 s = textArray[index]; buttons[index].setText(s); } } }); }
如果你的text0到text3是连续的,这种数组方式是更优的选择,既避免了反射的性能问题,也更符合Android资源管理的规范。
内容的提问来源于stack exchange,提问作者Ana-Maria
相关产品推荐
相关产品推荐

