据我所知,活动将自动保存视图的状态,像EditText和TextView这样的东西将自动恢复它们的状态。这不适用于可见性吗?例如:如果默认情况下在XML中,TextView是可见的,如果使用tvInput.setVisibility(View.GONE);通过编程将textview设置为GONE如果重新创建活动,则tvInput不会保持为GONE,它现在在不应显示时显示。这是预期的行为吗?我需要自己处理视图可见性吗?
EditText
TextView
tvInput.setVisibility(View.GONE);
GONE
tvInput
jogvjijk1#
是否在XML文件中为TextView设置了ID?只有具有ID的视图才会自动还原其状态。此外,如果要重写onSaveInstanceState(...)和/或onRestoreInstanceState(...),请不要忘记从调用超类的方法开始:
super.onSaveInstanceState(...); super.onRestoreInstanceState(...);
还要记住,在onCreate(...)中,你的视图还没有恢复,它们只是在以后才恢复。
whhtz7ly2#
我有点晚了,但这可能是有用的任何人谁想要手动存储和恢复视图的可见性状态。
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)
2条答案
按热度按时间jogvjijk1#
是否在XML文件中为TextView设置了ID?只有具有ID的视图才会自动还原其状态。此外,如果要重写onSaveInstanceState(...)和/或onRestoreInstanceState(...),请不要忘记从调用超类的方法开始:
还要记住,在onCreate(...)中,你的视图还没有恢复,它们只是在以后才恢复。
whhtz7ly2#
我有点晚了,但这可能是有用的任何人谁想要手动存储和恢复视图的可见性状态。
片段中的用法