【问题标题】:Android toggle button stateAndroid 切换按钮状态
【发布时间】:2013-04-06 07:51:36
【问题描述】:

您好,我有一个显示切换按钮的活动。问题是,当我按下设备上的后退按钮然后我回到我的活动时,按钮的状态会被重置。

如何使 Activity 在其整个生命周期中“记住”按钮的状态?

【问题讨论】:

  • 使用 SharedPrefrences...
  • 使用您在onCreate()onSaveInstanceState() 中获得的包来加载/保存按钮状态。首选项不应用于生命周期临时存储。

标签: android togglebutton activity-lifecycle


【解决方案1】:

根据您的要求在onCreate()onResume() 中执行此操作:

SharedPreferences preferences = this.getSharedPreferences(Constants.SENDEVENT_PREFERENCE,Context.MODE_PRIVATE);
if(preferences.getBoolean(Constants.SENDEVENT_PREFERENCE_SAVE_LIBRARY, false))
            lib.setChecked(true);

onCheckedChanged 方法中这样做:

if (buttonView == lib) {
            if (isChecked) {
                prefsEditor.putBoolean(Constants.SENDEVENT_PREFERENCE_SAVE_LIBRARY,
                        true);
                prefsEditor.commit();
            } else {
                prefsEditor.putBoolean(Constants.SENDEVENT_PREFERENCE_SAVE_LIBRARY,
                        false);
                prefsEditor.commit();
            }
}

【讨论】:

    【解决方案2】:

    您必须将状态保存在持久内存中。在这种情况下,我会说Shared Preferences 是您的最佳选择。

    类似于(在您的活动中使用切换按钮):

    public void saveButtonState(boolean pressed) {
        SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean("TOGGLE_BUTTON_STATE", pressed);
        editor.commit();
    }
    

    然后在 onCreate 中,您可以通过从 SharedPreferences 中读取“TOGGLE_BUTTON_STATE”来设置按钮状态。

    【讨论】:

    • 谢谢,我用了这个,我解决了将状态恢复到 onResume() 方法;)
    • 很好,考虑接受我的回答,以便问题得到解答
    【解决方案3】:

    状态重置的原因是由于Android架构,您的活动被完全破坏然后再次恢复。要存储按钮的状态,您应该在 onSaveInstaceState() 中将其状态保存到 Bundle 中并在 onRestoreInstanceState() 中恢复 - 这些方法是专门为此类任务设计的。

    所以答案是你应该通过两种方法实现保存/恢复按钮状态:

    @Override
    protected void onSaveInstanceState (Bundle outState) {
        // Your code here
    }
    
    @Override
    protected void onRestoreInstanceState (Bundle savedInstanceState) {
        // Your code here
    }
    

    详情见docs

    请注意上表中的“Killable”列——对于那些被标记为可杀死的方法,在该方法返回后,托管该活动的进程可能随时被系统杀死,而无需执行另一行代码.因此,您应该使用 onPause() 方法将任何持久性数据(例如用户编辑)写入存储。此外,方法 onSaveInstanceState(Bundle) 在将 Activity 置于此类后台状态之前被调用,允许您将 Activity 中的任何动态实例状态保存到给定的 Bundle 中,以便稍后在 onCreate(Bundle) 中接收该 Activity需要重新创建。有关流程的生命周期如何与其托管的活动相关联的更多信息,请参阅流程生命周期部分。请注意,将持久数据保存在 onPause() 而不是 onSaveInstanceState(Bundle) 中很重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的所有情况下都被调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多