我正在创建一个需要快速测试一些不同语言的应用程序。我有3个字符串资源文件,values / strings.xml,values-es / strings.xml和values-fr / strings.xml。每个文件都有各自的翻译字符串。
启动应用程序时,我正在将一些文本预加载到TextView(Locale.getDefault()。displayLanguage)中,并将我从xml文件中的数组中提取的文本分配给EditText一个字符串:>
<string-array name="some_text">
<item>Overall, how severe were your flu symptoms today? Please select one response only.</item>
<item>No flu symptoms today</item>
<item>Mild</item>
<item>Moderate</item>
<item>Severe</item>
<item>Very Severe</item>
</string-array>
我这样设置语言标签的文本:
languageTxt = findViewById(R.id .language_text)
languageTxt.text = Locale.getDefault().displayLanguage
然后将字符串加载到数组中,并将其中一个设置为EditText,如下所示:
textList = resources.getStringArray(R.array.some_text)
editTxt = findViewById(R.id.edit_text)
if(textList.isNotEmpty()) {
val txt = textList[currentIndex] //currentIndex = 0
editTxt.setText(txt)
}
textList,languageTxt和editTxt被声明为私有,例如:
private lateinit var textList: Array<String>
private lateinit var languageTxt: TextView
private lateinit var editTxt: EditText
第一次运行onCreate,一切正常。如果将语言设置为西班牙语,则languageTxt和editTxt均按预期使用西班牙语。然后,如果我转到设置并将语言更改为法语,则当我将我的应用返回到前台时,languageTxt会说法语(法语拼写很好)。然后,我在调试器中观看,textList加载了文本,并且所有的法语字符串都与我期望的一样。我看到的问题是当我设置editText时,控件未更新为显示法语字符串。它仍然是西班牙语。我可以清楚地看到文本是法语的,但是调用setText()似乎无效。我尝试过先清除exitTxt,将其设置为null,empty等,似乎没有任何效果。有人知道这是怎么回事吗?我已经挠头了几个小时。 gh
答案 0 :(得分:0)
如果在更改语言期间您的应用程序处于前台,则您的UI可能需要在onResume上重新加载,以便可以加载预期的资源。 您可以将默认语言保存为首选项,并在onActivityResume上检查值的更改,如果为true,则重新加载UI。
类似
override fun onResume() {
super.onResume()
...
if (localeHasChanged)
setContentView(R.layout.xxx) //force UI reload
...
}
答案 1 :(得分:0)
感谢吉迪·纳亚(Giddy Naya)的回答,让我对正在发生的事情有所提示。 Android在后台运行时会保存该应用程序的状态,以便在返回前台时相同。太奇怪了,因为即使editTxt.setText()也不起作用,并且被Android覆盖。所以我要做的就是在onResume函数中设置应用的新状态(即更新文本):
override fun onResume() {
super.onResume()
if(textList.isNotEmpty()) {
val txt = textList[currentIndex]
editTxt.setText(txt)
}
}
如果您是Android的新手,那么此功能会使调试变得很麻烦,因为您试图在onCreate中设置新状态,并且它不会改变。
我仍然不确定为什么要在onCreate()中设置TextView,而不能设置EditText。