调用 recreate() 方法时不会刷新 TextInputLayout 提示

TextInputLayout hint doesn't get refreshed upon recreate() method call

我正在使用 TextInputLayout。我将 string.xml 的提示设置为应用本地化。因此,在从下拉列表中更改语言后,我使用 recreate() 方法刷新整个 activity 具有选定语言资源的组件,但 TextInputLayout 提示没有得到刷新。

这是 material 库的已知错误 TextInputLayout 已经报告 here

遗憾的是,目前还没有解决办法。

PS:一种可能的解决方法是在 onRestoreInstanceState 上再次手动调用 textInputLayout.setHint(R.string.your_string) 以更新文本。 (在super.onRestoreInstanceState(bundle)之后调用) 或者在 onViewStateRestored

中调用它

根据@MatPag 的回答,您可以在 MainActivity 中添加此功能。

private fun findCurrentVisibleFragment(): BaseFragment? {
    val navHost = supportFragmentManager.findFragmentById(R.id.nav_host_fragment)
    return navHost?.childFragmentManager?.primaryNavigationFragment as? BaseFragment?
}

你所有的 Fragments 都扩展了 BaseFragment。然后,你的 activity 的 onRestoreInstanceState 必须是这样的:

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    (findCurrentVisibleFragment() as? YourFragment)?.setHints()
} 

其中 setHints() 是 YourFragment 中的一个函数,如下所示:

fun setHints() {
    binding.editUserNameContainer.setHint(R.string.gen_user_name)
    binding.editPasswordContainer.setHint(R.string.gen_password)
}