在配置更改期间保存 Var

Saving a Var during a configuration change

在屏幕旋转时,我想保存 var cardcount,这样用户在旋转屏幕时不会重置到第一张闪存卡。

我曾尝试使用 onSaveInstanceState 和 savedInstanceState.getInt() 来保持循环中的值,但它不会保存值。

我已经看到了这些功能的替代品,但我不确定我是否正在为一些简单的事情而深入兔子洞,或者我是否完全在错误的海洋中游泳。

我应该研究 ViewModel 和持久存储,通过配置更改手动接管,还是共享首选项?数据是一个变量,在一个片段中。

class Components : Fragment() {

    //Variables to keep track of which card, as well as which side is showing
    private var cardcount = 0
    private var cardfront = true


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        //This is the function to set the image and text for the front and back of the flashard
        fun select_card() {
            card_front.setImageResource(map.getValue(cardcount).image)
            card_back.text = map.getValue(cardcount).text
        }
}

这就是 ViewModel 的用途。

根据 android 文档:

The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way. The ViewModel class allows data to survive configuration changes such as screen rotations.

https://developer.android.com/topic/libraries/architecture/viewmodel

如果您还没有使用 ViewModels,您绝对不需要,而且 SharedPreferences 可能就此而言太多了 - 但这完全取决于您想要什么。

如果您只想在应用“打开”(包括在后台)时保留一个值,那么 onSaveInstanceState() 方法就是为此而设计的。在它提供的 Bundle 中弹出一个值,当你的片段需要恢复状态时,它会通过 onCreateViewonViewCreatedonViewStateRestored 传回......只需选择在最方便的生命周期回调中,检查 Bundle 是否为空(请参阅下一部分!)并使用用于存储它的相同键获取值。


如果片段 没有 恢复以前的状态,您将不会传入一个包。您的应用程序可以随时被系统关闭(比如释放内存),所以当它重新启动时,它看起来一直都是 运行 - 这就是 onSaveInstanceState 被调用的原因,以及为什么你得到一个包传递的原因,所以你可以把一切恢复到进入后台时的状态。

但是如果用户关闭应用程序,比如将其滑开,下次您打开它时将是一个全新的开始 - 没有任何状态可以保留,因此您不会获得捆绑包。因此,如果您 do 想要在应用程序运行之间保持状态(比如用户选择的语言),您将需要使用 SharedPreferences 之类的东西来存储一些数据,并加载在你的片段中。


ViewModels 无法在进程死亡(系统在后台终止您的应用程序)后存活下来,因此它们不会像 onSavedInstanceState 那样保持状态。它们更多地用于诸如配置更改之类的事情,应用程序将留在前台。你仍然必须能够处理你的状态丢失,并能够重新创建它。还有一些其他库可以扩展 ViewModels 来帮助您处理这个问题,但是......在我看来,只需将 Bundle 用于 Int,保持简单

绝对不要覆盖配置更改!那是 a last resort,你的例子就像,基本保存的实例 Bundle 用例