DialogFragment — установка начальных значений и сохранение состояния после поворота

Я создал DialogFragment, который создает и возвращает AlertDialog из метода onCreateDialog. AlertDialog содержит два представления EditText.

Я устанавливаю начальные значения этих двух текстов редактирования в методе onCreateDialog, который отлично работает, пока я не поверну телефон, и все изменения не будут потеряны/восстановлены до начальных значений, потому что onCreateDialog вспоминается.

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

Ниже я вставил упрощенную версию моего кода. Одним из решений может быть инициализация атрибутов класса в методе newInstance(), но тогда мне нужно сделать их статическими. Другим решением может быть передача значений через Bundle, но никакие методы ввода не принимают Calendar в качестве типа параметра.

Что такое лучшая практика?

public class MyDialogFragment extends DialogFragment implements OnClickListener, OnDateSetListener, OnQuantitySetListener 
{
private EditText editText1, editText2
private MyObject myObject;


public static MyDialogFragment newInstance() 
{
    return new MyDialogFragment ();
}


@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater factory = LayoutInflater.from(getActivity());
    final View v = factory.inflate(R.layout.my_layout, null);

    editText1 = (EditText) v.findViewById(R.id.text1);
    editText2 = (EditText) v.findViewById(R.id.text2);

    myObject = <get the object from database>;

    editText1.setText(myObject.attribute1);
    editText2.setText(myObject.attribute2);


    bindDataToViews();

    return new AlertDialog.Builder(getActivity())
            .setIconAttribute(R.drawable.add)
            .setTitle("Title of the dialog")
            .setView(v)).create();
}

... other methods using getting the values from EditText and putting them back to MyObject

}


person Ismar Slomic    schedule 13.08.2012    source источник


Ответы (2)


Вы можете сохранить свои данные в методе onSaveInstanceState(Bundle outState) и прочитать их снова в методе onRestoreInstanceState(). onSaveInstanceState будет вызываться перед поворотом экрана, а onRestoreInstanceState() после изменения. Это хорошее место для хранения данных между изменениями ориентации.

Или вы также можете добавить в файл манифеста

android:configChanges="orientation"

Добавьте это значение в активность, содержащую ваш файл alertDialog.

person Mike    schedule 13.08.2012
comment
Но я думаю, что для установки начальных значений я мог бы просто использовать конструктор. Он вызывается только один раз, когда DialogFragment создается в первый раз. Верно? - person Ismar Slomic; 14.08.2012
comment
Когда вы поворачиваете экран, действие/диалог уничтожается и создается заново, поэтому все методы (и конструктор) вызываются снова, если только вы не установите, например, anroid:configChange в файле манифеста. - person Mike; 14.08.2012
comment
Хорошо, я вижу. Итак, вы предлагаете мне установить начальное и последнее значения состояния из методов onSaveInstanceState/onRestoreInstanceState? - person Ismar Slomic; 14.08.2012
comment
Вы можете установить начальное значение, например, в методе onCreateDialog(), затем вы можете сохранить значение в onSaveInstanceState и восстановить их в методе onRestoreInstancenState(). - person Mike; 14.08.2012
comment
Ok. Спасибо! Но вы бы порекомендовали установить configChanges для ориентации? Каковы плюсы и минусы этого, потому что это было бы самым простым решением в моем случае, верно? - person Ismar Slomic; 14.08.2012
comment
Когда вы устанавливаете configChanges для ориентации, это все равно, что сказать Android: если пользователь повернет экран, пожалуйста, не уничтожайте активность, я сам позабочусь об этом событии. Основное преимущество метода saveInstanceState заключается в том, что он работает с каждым событием (например, телефонным звонком). Метод всегда сохраняет данные, независимо от того, какое событие происходит. - person Mike; 14.08.2012
comment
Мой последний вопрос: как я могу сохранить MyObject в Bundle в onSaveInstanceState, если MyObject не сериализуем? - person Ismar Slomic; 14.08.2012
comment
Исмар, вам нужно было бы сделать его сериализуемым или разделяемым для хранения всего объекта. Вот хорошее руководство по созданию посылок: shri.blog.kraya.co.uk/2010/04/26/ - person span; 14.08.2012
comment
@Mike Вы должны знать, что помимо ориентации экрана есть и другие изменения конфигурации. Если вы не обработаете их все, в некоторых случаях активность может быть уничтожена и воссоздана заново. - person sstn; 01.03.2013

Calendar это Serializable, так что вы можете поставить его как Bundle.

person techiServices    schedule 13.08.2012