DialogFragment - 设置初始值并在旋转后保留状态

时间:2012-08-13 20:35:11

标签: android android-fragments android-lifecycle android-dialogfragment

我创建了一个 DialogFragment ,它正在构建并从 onCreateDialog 方法返回 AlertDialog 。 AlertDialog包含两个EditText视图。

我在 onCreateDialog 方法中设置这两个编辑文本的初始值,直到我旋转手机并且所有更改都丢失/恢复为初始值,因为 onCreateDialog 被召回。

所以我的问题是我应该在哪里放置初始值,以便它们仅在您第一次打开对话框时设置,如果您已完成更改并旋转手机,则保留并缓存最后一个状态?

下面我粘贴了我的代码的简化版本。一种解决方案可能是在newInstance()方法中初始化类属性,但是我需要将它们设置为静态。其他解决方案可能是通过Bundle传递值,但没有put方法将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

}

2 个答案:

答案 0 :(得分:2)

CalendarSerializable,因此您可以将其作为Bundle中的内容。

答案 1 :(得分:-1)

您可以将数据存储在onSaveInstanceState(Bundle outState)方法中,并在onRestoreInstanceState()方法中再次读取它们。 onSaveInstanceState将在屏幕旋转之前调用,而onRestoreInstanceState()在更改之后调用。这是在方向更改之间存储数据的好地方。

或者您也可以添加清单文件

android:configChanges="orientation"

将此值添加到activitiy,其中包含alertDialog。