android - 片段,DialogFragment和屏幕旋转



4 Answers

好的,虽然Zsombor的方法有效,但这是由于我对Fragments缺乏经验而且他的解决方案导致了saveInstanceState Bundle问题。

显然(至少对于DialogFragment),它应该是一个public static class 。 您还必须编写自己的static DialogFragment newInstance()方法。 这是因为Fragment类在其instantiate()方法中调用newInstance方法。

总而言之,你必须像这样编写DialogFragments:

public static class MyDialogFragment extends DialogFragment {

    static MyDialogFragment newInstance() {
        MyDialogFragment d = new MyDialogFragment();
        return d;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        ...
    }
}

并向他们展示:

private void showMyDialog() {
    MyDialogFragment d = MyDialogFragment.newInstance();
    d.show(getFragmentManager(), "dialog");
}

这可能是ActionBarSherlock库所独有的,但SDK文档中的官方示例也使用此范例。

android android-fragments

我有一个Activity用这个XML调用setContentView:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    >
    <fragment android:name="org.vt.indiatab.GroupFragment"
        android:id="@+id/home_groups"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1" />
            <..some other fragments ...>
</LinearLayout>

GroupFragment扩展了Fragment,一切都很好。 但是,我在GroupFragment中显示了一个DialogFragment。 这显示正确,但是当屏幕旋转时,我得到一个强制关闭。

从DialogFragment.show(FragmentManager,String)以外的其他片段中显示DialogFragment的正确方法是什么?




我使用了所提出的解决方案的混合,并添加了一件事。 这是我的最终解决方案:

我在onCreateDialog中使用了setRetainInstance(true); 我用过这个:

public void onDestroyView() {
    if (getDialog() != null && getRetainInstance())
        getDialog().setDismissMessage(null);
    super.onDestroyView();
}

作为savedInstanceState无法解决的工作方式,我创建了一个名为StateHolder的私有类(与为listView创建持有者的方式相同):

private class StateHolder {
    String name;
    String quantity;
}

我这样保存状态:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    stateHolder = new StateHolder();
    stateHolder.name = actvProductName.getText().toString();
    stateHolder.quantity = etProductQuantity.getText().toString();
}

在onDismiss方法中,我将stateHolder设置为null。 创建对话框时,它会验证stateHolder是否为null以恢复状态或仅正常初始化所有内容。




我有一个类似的问题,但上面没有一个对我有用。 最后,我需要在代码中而不是在XML布局中创建片段。

请参阅: 更换碎片和方向更改




我遇到了这个问题,并且onDestroyView()技巧无效。 事实证明,这是因为我在onCreate()进行了一些相当密集的对话创建。 这包括保存对AlertDialog的引用,然后我将在onCreateDialog()返回。

当我将所有这些代码移动到onCreateDialog()并停止保留对该对话框的引用时,它再次开始工作。 我希望我违反了一个不变量DialogFragment关于管理它的对话框。




Related