savedInstanceState - 可见性更改未恢复?

问题描述 投票:0回答:2

据我所知,Activity 会自动保存 View 的状态,而

EditText
TextView
之类的东西会自动恢复它们的状态。

这不适用于可见性吗?

例如: 如果默认情况下在 XML 中,我有一个可见的

TextView
。 如果我使用
GONE
 以编程方式将 textview 设置为 
tvInput.setVisibility(View.GONE);

如果重新创建活动,则

tvInput
不会被维护,因为
GONE
它现在是可见的,而它不应该是可见的。

这是预期的行为吗?我需要自己处理视图可见性吗?

android android-activity
2个回答
0
投票

您是否在 XML 文件中为 TextView 设置了 id?只有带有 id 的视图才会自动恢复它们的状态。 此外,如果您要覆盖 onSaveInstanceState(...) 和/或 onRestoreInstanceState(...),请不要忘记从调用超类的方法开始:

super.onSaveInstanceState(...);

super.onRestoreInstanceState(...);

还请记住,在 onCreate(...) 中,您的视图尚未恢复。他们只会在以后恢复。


0
投票

我有点晚了,但这对任何想要手动存储和恢复视图可见性状态的人都有用。


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)
© www.soinside.com 2019 - 2024. All rights reserved.