据我所知,Activity 会自动保存 View 的状态,而
EditText
和 TextView
之类的东西会自动恢复它们的状态。
这不适用于可见性吗?
例如: 如果默认情况下在 XML 中,我有一个可见的
TextView
。
如果我使用 GONE
以编程方式将 textview 设置为
tvInput.setVisibility(View.GONE);
如果重新创建活动,则
tvInput
不会被维护,因为 GONE
它现在是可见的,而它不应该是可见的。
这是预期的行为吗?我需要自己处理视图可见性吗?
您是否在 XML 文件中为 TextView 设置了 id?只有带有 id 的视图才会自动恢复它们的状态。 此外,如果您要覆盖 onSaveInstanceState(...) 和/或 onRestoreInstanceState(...),请不要忘记从调用超类的方法开始:
super.onSaveInstanceState(...);
super.onRestoreInstanceState(...);
还请记住,在 onCreate(...) 中,您的视图尚未恢复。他们只会在以后恢复。
我有点晚了,但这对任何想要手动存储和恢复视图可见性状态的人都有用。
fun Bundle.saveVisibility(vararg views: View) {
views.forEach { view ->
putInt(view.id.toString(), view.visibility)
}
}
fun Bundle.restoreVisibility(vararg views: View) {
views.forEach { view ->
if (containsKey(view.id.toString())) {
view.visibility = getInt(view.id.toString())
}
}
}
片段中的用法
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
savedInstanceState?.restoreVisibility(*viewDataBinding.inputViews.toTypedArray())
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.saveVisibility(*viewDataBinding.inputViews.toTypedArray())
}
private val FragmentGroupCreateDepositsBinding.inputViews: List<View>
get() = listOf(tilSharePrice, tilFlatAmount, tilMinAmount, tilMaxAmount, tvRequiredHint, llRangeAmount)