更改设置语言后,为什么EditText无法更新?

时间:2019-07-31 22:43:37

标签: android kotlin 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,empty等,似乎没有任何效果。有人知道这是怎么回事吗?我已经挠头了几个小时。 gh

2 个答案:

答案 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。

相关问题