我创建了一个使用 TTS 引擎向用户发送反馈的应用程序。为了提高性能,我使用了synthesizeToFile
andaddSpeech
方法,但是要合成的文本字符串在strings.xml
文件中,所以我必须为 TTS 引擎说出的每个字符串调用这些方法。
由于 TTS 引擎只使用名称以 开头的字符串tts_
,是否可以轻松地遍历文件中所有以开头的tts_
字符串strings.xml
?
我创建了一个使用 TTS 引擎向用户发送反馈的应用程序。为了提高性能,我使用了synthesizeToFile
andaddSpeech
方法,但是要合成的文本字符串在strings.xml
文件中,所以我必须为 TTS 引擎说出的每个字符串调用这些方法。
由于 TTS 引擎只使用名称以 开头的字符串tts_
,是否可以轻松地遍历文件中所有以开头的tts_
字符串strings.xml
?
您可以通过反射获取 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
}
}
}
您可以将资源名称全部(在定义时)指定为"prefix"+(1..n)
. 而在代码使用中,
int resid=<constant>;
for(i=1;resid!=0;i++){
resid = this.getResources().getIdentifier("prefix"+i, "strings", this.getPackageName());
}
您可以将这些 TTS 字符串放入TypedArray中。
您可以使用以下代码:
String[] strings = getResources().getAssets().list("string");
for (int i = 0; i < strings.length; i++) {
Log.d("aaa ", strings[i]);
}
遍历字体等其他资源,...只需将字符串替换为文件夹名称。
在我所有的项目中,我只是观察到 R.java 中字符串的值以开头0x7f050000
并且向上计数,例如0x7f050001, 0x7f050002, 0x7f050003,
....
你可以只是++
他们:D
希望能帮助到你 :)