android - 为什么在设置中更改语言后 EditText 不更新?
问题描述
我正在创建一个需要快速测试一些不同语言的应用程序。我有 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、空等,似乎没有任何效果。有谁知道这里发生了什么?几个小时以来,我一直在挠头。啊
解决方案
感谢 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 无效。
推荐阅读
- google-colaboratory - 谷歌 Colab 工具来估计 Colab 使用的能源消耗和碳足迹?
- c++ - 用于复制的简单堆分配的 C++ 包装器?
- security - 安全性不足:从触发持续集成的分叉中拉取请求
- perl - Getopt::Long - 如何获取不是选项的脚本参数
- python - 如何将列表的每个项目包装到正确的列表中
- php - Laravel Passport 未定义索引:文件中的请求
- python - 使用 Python 进行网页抓取 - 空数据框
- python - 如果 B 的任何子列表在 A 中,如何比较列表 A 和 B 并返回是
- php - 如何根据提交表单的 ID 显示查询结果?(php)
- reactjs - 如何使用我们在 reactjs 中存储 api 的文件?