【问题标题】:Android: onSaveInstanceState in Back buttonAndroid:返回按钮中的 onSaveInstanceState
【发布时间】:2013-03-22 12:00:21
【问题描述】:

我正在开发一个应用程序,其中我覆盖了后退按钮。我创建了一个复选框。点击我正在调用的意图:

startActivityforResult();

并且还保持活动状态为:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  savedInstanceState.putBoolean("checkbox", checkbox.isChecked());
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  checkbox_state = savedInstanceState.getBoolean("checkbox");
}

运行良好并且状态保持不变。 表示我在编辑文本中输入值。并在复选框上单击为结果调用新活动,并在返回第一个活动时保持状态。

现在但是从第二个活动开始,如果我单击设备后退按钮,则不会保持状态。

那么我应该怎么做才能保持后退按钮的状态。我搜索但没有找到满意的解决方案。请给我建议。

【问题讨论】:

    标签: android back android-button persist savestate


    【解决方案1】:

    当您启动新的 Activity 时,当前的 Activity 被隐藏,新的 Activity 被放置在堆栈的顶部。现在,如果您按下新 Activity 上的后退按钮,那么第一个 Activity 应该以其当前状态出现(如果它没有被破坏,则调用 finish())它离开的地方,即如果复选框被选中,那么它应该保持检查。除非方向改变或 Activity 被销毁,否则无需保存 Activity 状态。

    你确定你没有在 onActivityResult 或 onResume() 方法中做任何影响复选框状态的事情吗?我建议先注释掉这两种方法中的所有代码,看看你的复选框是否保留了状态。你也可以确保代码本身在启动新 Activity 之前不会取消选中该复选框吗?

    【讨论】:

    • 我在activity2的编辑文本中输入了一些数据,并通过intent在activity1中捕获了这些数据。
    【解决方案2】:

    现在但是从第二个活动开始,如果我单击设备后退按钮,则不会保持状态。

    onSaveInstanceState() 主要用于配置更改(例如,旋转屏幕)。

    那么我应该怎么做才能保持后退按钮的状态

    在您的数据模型之外,很可能没有需要“维护”的“状态”。您的活动需要更新其数据模型:文件、数据库、首选项、ContentProvider、一些作为您的内存数据模型管理器的单例,等等。

    【讨论】:

    • 假设我有一个从数据库中填充的 ListView。您是否认为每次从另一个活动导航回数据库时都应该从数据库中填充它?或者我应该保持适配器内容保存在状态并重复使用它?只是想知道你的看法:)
    • @ΕГИІИО:从数据库填充是最安全的,因为自上次活动以来数据很可能已经发生变化。将其保存在状态中是最糟糕的选择。中间立场是维护某种数据模型管理单例,它缓存信息并且是所有活动访问数据模型的点。
    • 这是最糟糕的,因为它浪费资源吗?如果您知道在这两个活动之间导航时数据没有得到更新,那么从状态中恢复它会不会更有响应?因为我讨厌在导航之间或旋转屏幕时看到“正在加载请稍候...”的东西:)
    • @ΕГИІИО:“这是最糟糕的,因为它浪费资源吗?” - 如果您要占用大量 RAM,请以更好地利用它的方式这样做。此外,它最有可能过时。 “从状态中恢复它不是更敏感吗?” -- 是的,如果您忽略所有其他问题。 “因为我讨厌在我的导航之间或当我旋转屏幕时看到'正在加载请稍候......'的东西” - 你还有其他问题,除非 Traceview 显示你的延迟 100% 是在数据库 I/O 中.
    • @ΕГИІИО:对于配置更改,更好的解决方案是保留ListFragment。除非先前的活动实例是 finish()'d,否则导航不应导致数据库重新查询。
    猜你喜欢
    • 1970-01-01
    • 2019-11-16
    • 2014-09-27
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2014-04-14
    相关资源
    最近更新 更多