0

我想写一些帮助程序来保存和恢复 Bundle 中的活动状态

重写方法onCreate(Bundle savedState)仍然onSaveInstanceState(Bundle outState)是必要的,但是简单的表单保存/恢复有点无聊

像这样的东西:

class StateHelper {

    static void restore(Bundle bundle, String[] properties, Object[] connections){
        for(int i = 0; i < properties.length; i++){
            if(bundle.containsKey(properties[i])){
                restoreState(properties[i], connections[i]);
            }
        }
    }

    static void save(Bundle bundle, String[] properties, Object[] connections){
        for(int i = 0; i < properties.length; i++){
            saveState(properties[i], connections[i]);
        }
    }

    restoreState(String s, Object o){
        if(o instanceof EditText){
            // restore state with getString
        } else if(o instanceof Checkbox){
            // save state with getBoolean
        } 
        // etc. etc. handle all UI types
    }

    saveState(String s, Object o){
        // similar to restoreState(String, Object)
        // only saving instead of restoring
    }
}

并像这样使用:

String[] props = {LOGIN,PASSWORD,REALNAME};
Object[] cons = {textedit_login, textedit_password, textedit_realname};
StateHelper.restore(savedState, props, cons);
// or
StateHelper.save(outBundle, props, cons);

在我花一整天时间创建它之前,我的问题是,是否有任何类似的帮助类或本地方式来执行这个简单的保存/恢复操作?

4

2 回答 2

1

通常,如果您调用 super.onSaveInstanceState,则不需要像在助手中所做的那样保存 UI 状态。Android 框架负责保存 UI 状态,如javadocs中所述:

默认实现通过在层次结构中具有 id 的每个视图上调用 onSaveInstanceState() 并保存当前聚焦视图的 id(所有这些都由onRestoreInstanceState(Bundle)) 的默认实现。如果您重写此方法以保存每个单独视图未捕获的附加信息,您可能需要调用默认实现,否则请准备好自己保存每个视图的所有状态。

因此,为了保存 ui 状态,它是内置的,要保存应用程序的其他状态,您需要一些自定义逻辑。我认为没有任何通用的实用程序类。

于 2011-11-29T11:00:00.347 回答
1

像 EditText 或 Checkbox 这样的视图会自动保存/恢复它们的状态,您不需要手动进行。恢复发生在 中onRestoreInstanceState(Bundle),因此如果您覆盖此方法,请不要忘记调用super.onRestoreInstanceState(Bundle).

于 2011-11-29T11:00:16.447 回答