android savedInstanceState -可见性更改未恢复?

wrrgggsh  于 2023-03-11  发布在  Android
关注(0)|答案(2)|浏览(99)

据我所知,活动将自动保存视图的状态,像EditTextTextView这样的东西将自动恢复它们的状态。
这不适用于可见性吗?
例如:如果默认情况下在XML中,TextView是可见的,如果使用tvInput.setVisibility(View.GONE);通过编程将textview设置为GONE
如果重新创建活动,则tvInput不会保持为GONE,它现在在不应显示时显示。
这是预期的行为吗?我需要自己处理视图可见性吗?

jogvjijk

jogvjijk1#

是否在XML文件中为TextView设置了ID?只有具有ID的视图才会自动还原其状态。此外,如果要重写onSaveInstanceState(...)和/或onRestoreInstanceState(...),请不要忘记从调用超类的方法开始:

super.onSaveInstanceState(...);

super.onRestoreInstanceState(...);

还要记住,在onCreate(...)中,你的视图还没有恢复,它们只是在以后才恢复。

whhtz7ly

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)

相关问题