Android 如何轻松地迭代";strings.xml";资源文件?

Android 如何轻松地迭代";strings.xml";资源文件?,android,android-resources,Android,Android Resources,我创建了一个应用程序,它使用TTS引擎向用户发送反馈。为了提高性能,我使用了synthesizeToFile和addSpeech方法,但是要合成的文本字符串在strings.xml文件中,因此我必须为TTS引擎所说的每个字符串调用这些方法 由于TTS引擎只使用名称以TTS\uu开头的字符串,在我的所有项目中,是否可以轻松地迭代strings.xml文件中以TTS\u开头的所有字符串?,我刚刚注意到R.java中字符串的值以0x7f050000开头,并且它向上计数,比如0x7f050001、0x7

我创建了一个应用程序,它使用TTS引擎向用户发送反馈。为了提高性能,我使用了
synthesizeToFile
addSpeech
方法,但是要合成的文本字符串在
strings.xml
文件中,因此我必须为TTS引擎所说的每个字符串调用这些方法


由于TTS引擎只使用名称以
TTS\uu
开头的字符串,在我的所有项目中,是否可以轻松地迭代
strings.xml
文件中以
TTS\u
开头的所有字符串?

,我刚刚注意到R.java中字符串的值以
0x7f050000
开头,并且它向上计数,比如
0x7f050001、0x7f050002、0x7f050003、

你可以直接
++
他们:D

希望有帮助:)

您可以将所有资源名称(定义时)都指定为
“prefix”+(1..n)
。在代码使用方面

int resid=<constant>;
for(i=1;resid!=0;i++){
        resid = this.getResources().getIdentifier("prefix"+i, "strings", this.getPackageName());
}
intresid=;
对于(i=1;resid!=0;i++){
resid=this.getResources().getIdentifier(“前缀”+i,“字符串”,this.getPackageName());
}

您可以将这些TTS字符串放入一个字符串中。

您可以通过反射获得strings.xml中的所有字符串,并仅过滤出您需要的字符串,如下所示:

for (Field field : R.string.class.getDeclaredFields())
{
  if (Modifier.isStatic(field.getModifiers()) && !Modifier.isPrivate(field.getModifiers()) && field.getType().equals(int.class))
  {
    try
    {
      if (field.getName().startsWith("tts_"))
      {
        int id = field.getInt(null);
        // do something here...
      }
    } catch (IllegalArgumentException e)
    {
      // ignore
    } catch (IllegalAccessException e)
    {
      // ignore
    }
  }
}

如果您的代码为arrays.xml attr.xml,则不能假定它从0x7f050000开始,有时它会发生变化。。您是对的,它提供了增量id,但您不能假设最低id。我自己没有尝试过,但如果它有效,这是问题的答案,而不是公认的答案,这只适用于名称tts_1、tts_2等可接受的荒谬情况。您能指定这是哪个字段类吗?是java.lang.reflect.Field吗?是的,是java.lang.reflect.Field。它应该很容易找到,因为它是
类的返回类型。getDeclaredFields()
是否可以获取所有模块的字符串(每个R文件存在于不同的包中)?还有,如何为每种语言获取它?@androiddeveloper是的,但您必须提前知道(即硬代码)每个包中所有不同的R类(例如,
for(Field-Field:com.example.foo.R.string.class.getDeclaredFields())
)。解决这个问题的方法也有很多,但实际上要比这复杂得多。