在配置更改期间保存 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
如果您还没有使用 ViewModel
s,您绝对不需要,而且 SharedPreferences
可能就此而言太多了 - 但这完全取决于您想要什么。
如果您只想在应用“打开”(包括在后台)时保留一个值,那么 onSaveInstanceState()
方法就是为此而设计的。在它提供的 Bundle
中弹出一个值,当你的片段需要恢复状态时,它会通过 onCreateView
、onViewCreated
、onViewStateRestored
传回......只需选择在最方便的生命周期回调中,检查 Bundle
是否为空(请参阅下一部分!)并使用用于存储它的相同键获取值。
如果片段 没有 恢复以前的状态,您将不会传入一个包。您的应用程序可以随时被系统关闭(比如释放内存),所以当它重新启动时,它看起来一直都是 运行 - 这就是 onSaveInstanceState
被调用的原因,以及为什么你得到一个包传递的原因,所以你可以把一切恢复到进入后台时的状态。
但是如果用户关闭应用程序,比如将其滑开,下次您打开它时将是一个全新的开始 - 没有任何状态可以保留,因此您不会获得捆绑包。因此,如果您 do 想要在应用程序运行之间保持状态(比如用户选择的语言),您将需要使用 SharedPreferences
之类的东西来存储一些数据,并加载在你的片段中。
ViewModel
s 无法在进程死亡(系统在后台终止您的应用程序)后存活下来,因此它们不会像 onSavedInstanceState
那样保持状态。它们更多地用于诸如配置更改之类的事情,应用程序将留在前台。你仍然必须能够处理你的状态丢失,并能够重新创建它。还有一些其他库可以扩展 ViewModel
s 来帮助您处理这个问题,但是......在我看来,只需将 Bundle
用于 Int
,保持简单
绝对不要覆盖配置更改!那是 a last resort,你的例子就像,基本保存的实例 Bundle
用例
在屏幕旋转时,我想保存 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
如果您还没有使用 ViewModel
s,您绝对不需要,而且 SharedPreferences
可能就此而言太多了 - 但这完全取决于您想要什么。
如果您只想在应用“打开”(包括在后台)时保留一个值,那么 onSaveInstanceState()
方法就是为此而设计的。在它提供的 Bundle
中弹出一个值,当你的片段需要恢复状态时,它会通过 onCreateView
、onViewCreated
、onViewStateRestored
传回......只需选择在最方便的生命周期回调中,检查 Bundle
是否为空(请参阅下一部分!)并使用用于存储它的相同键获取值。
如果片段 没有 恢复以前的状态,您将不会传入一个包。您的应用程序可以随时被系统关闭(比如释放内存),所以当它重新启动时,它看起来一直都是 运行 - 这就是 onSaveInstanceState
被调用的原因,以及为什么你得到一个包传递的原因,所以你可以把一切恢复到进入后台时的状态。
但是如果用户关闭应用程序,比如将其滑开,下次您打开它时将是一个全新的开始 - 没有任何状态可以保留,因此您不会获得捆绑包。因此,如果您 do 想要在应用程序运行之间保持状态(比如用户选择的语言),您将需要使用 SharedPreferences
之类的东西来存储一些数据,并加载在你的片段中。
ViewModel
s 无法在进程死亡(系统在后台终止您的应用程序)后存活下来,因此它们不会像 onSavedInstanceState
那样保持状态。它们更多地用于诸如配置更改之类的事情,应用程序将留在前台。你仍然必须能够处理你的状态丢失,并能够重新创建它。还有一些其他库可以扩展 ViewModel
s 来帮助您处理这个问题,但是......在我看来,只需将 Bundle
用于 Int
,保持简单
绝对不要覆盖配置更改!那是 a last resort,你的例子就像,基本保存的实例 Bundle
用例