Помощник по сохранению и восстановлению состояния активности

Я хотел бы написать какой-нибудь помощник для сохранения и восстановления состояния активности из/в 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);

И прежде чем я потрачу целый день на его создание, у меня вопрос: есть ли какой-нибудь подобный вспомогательный класс или собственный способ, как выполнять эти простые действия сохранения/восстановления?


person Marek Sebera    schedule 29.11.2011    source источник


Ответы (2)


Как правило, вам не нужно сохранять состояние пользовательского интерфейса, как это делается в вашем помощнике, если вы вызываете super.onSaveInstanceState. Платформа Android заботится о сохранении состояния пользовательского интерфейса, как указано в javadocs:

Реализация по умолчанию заботится о большей части состояния пользовательского интерфейса для каждого экземпляра, вызывая onSaveInstanceState() для каждого представления в иерархии, которое имеет идентификатор, и сохраняя идентификатор текущего сфокусированного представления (все это восстанавливается реализация по умолчанию onRestoreInstanceState(Bundle)). Если вы переопределите этот метод, чтобы сохранить дополнительную информацию, не захваченную каждым отдельным представлением, вы, вероятно, захотите вызвать реализацию по умолчанию, в противном случае будьте готовы сохранить все состояние каждого представления самостоятельно.

Таким образом, для сохранения состояния пользовательского интерфейса оно встроено, для сохранения другого состояния вашего приложения вам понадобится некоторая пользовательская логика. Я не думаю, что для этого есть какой-то общий служебный класс.

person botteaap    schedule 29.11.2011

Такие представления, как EditText или Checkbox, сохраняют/восстанавливают свои состояния автоматически, вам не нужно делать это вручную. Восстановление происходит в onRestoreInstanceState(Bundle), поэтому, если вы переопределяете этот метод, не забудьте вызвать super.onRestoreInstanceState(Bundle).

person fhucho    schedule 29.11.2011