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

3
我创建了一个 DialogFragment,在 onCreateDialog 方法中构建并返回一个包含两个 EditText 视图的 AlertDialog。我在 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个回答

2

CalendarSerializable的,因此您可以将其作为Bundle中的对象放置。


-1

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

或者你也可以在 Manifest 文件中添加。

android:configChanges="orientation"

将此值添加到包含您的AlertDialog的活动中。


当您旋转屏幕时,活动/对话框将被销毁并重新创建,因此所有方法(和构造函数)都会再次调用,除非您在清单文件中设置了例如anroid:configChange。 - Mike
1
当您将confiChanges设置为方向时,就好像在告诉Android,如果用户旋转屏幕,请不要销毁活动,我会自己处理此事件。saveInstanceState方法的主要优点是它可以与每个事件(如电话呼叫)一起使用。该方法始终保存数据,无论发生什么事件。 - Mike
我的最后一个问题是,当MyObject不可序列化时,我该如何在onSaveInstanceState中将其保存到Bundle中? - Ismar Slomic
2
Ismar,你需要将它序列化或打包以存储整个对象。这里有一个很好的教程,可以帮助你制作可打包对象:http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/ - span
@Mike 你应该知道除了屏幕方向之外还有其他的配置更改。如果你没有处理好所有的更改,那么在某些情况下,活动可能会被销毁并重新创建。 - sstn
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接