首页 > 解决方案 > 为什么在设置中更改语言后 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、空等,似乎没有任何效果。有谁知道这里发生了什么?几个小时以来,我一直在挠头。啊

标签: androidkotlinandroid-edittext

解决方案


感谢 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 无效。


推荐阅读