TextInputLayout在调用recreate()方法后提示文本(hint)无法刷新。

7
我正在使用 TextInputLayout。我从 string.xml 设置了它的提示文字以实现本地化。因此,在从下拉菜单更改语言后,我使用 recreate() 方法刷新整个活动组件并使用选定语言的资源,但是 TextInputLayout 的提示文字没有得到刷新。
2个回答

9

2022年7月更新:

从材料版本1.7.0开始,该错误应该已经被修复。


这是材料库TextInputLayout已知的 bug,在此处已经报告过了:here

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


@FerozKhan 我已经更新了解决方法,这个肯定有效,但前提是你有访问那个生命周期回调的 TIL 视图。 - MatPag
我在一个片段中尝试这样做:override fun onViewStateRestored(savedInstanceState: Bundle?) { super.onViewStateRestored(savedInstanceState) binding.etLastName.setHint(R.string.text_hint_recipient_last_name) binding.etCity.setHint(R.string.text_hint_recipient_city) } - 但对我没起作用。 - Krushik
@MatPag 我在 onViewStateRestored() 中尝试了这个方法,它有效了。我正在使用 TextInputLayout + TextInputEditText(而不是 EditText)。 - Shikhar Deep
在onViewStateRestored中对我有效,但我不使用视图绑定,在OnCreateView中将TIL存储在本地变量中。 - hdort
发布了Material Components for Android (MDC-Android)1.7.0版本。 - MikeMcC399
显示剩余2条评论

0

根据@MatPag的答案,您可以在MainActivity中添加此函数。

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

在所有的碎片中都扩展了BaseFragment。然后,您的活动的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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接