1

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

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

4

3 回答 3

2

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();
            }
}
于 2013-04-06T08:01:21.817 回答
1

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

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

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

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

详情见文档

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

于 2013-04-06T08:08:19.360 回答
1

您必须将状态保存在持久内存中。我想说,在这种情况下,共享首选项是您的最佳选择

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

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”来设置按钮状态。

于 2013-04-06T07:57:50.657 回答