为什么在解除从Fragment启动的DialogFragment后,片段的onResume方法从未被触发?

时间:2013-10-05 11:07:18

标签: android android-fragments android-dialogfragment onresume dismiss

我将尽可能简短地解释我的问题。

我有一个名为FragmentA的片段,它在点击特定按钮后会显示一个DialogFragment。

public class FragmentA extends Fragment implements OnClickListener {

    ...

    @Override
    public void OnClick(View v) {
        if (v == dialogButton) {
            showDialog();
        }
    }

    public void showDialog() {
        String diagName = getResources().getString(R.string.dialog_title);
        MyDialog myDialog = MyDialog.newInstance(getFragmentAValue());
        myDialog.show(getFragmentManager(), diagName);
    }
}

public class MyDialog extends DialogFragment implements OnClickListener {
    ...
    @Override
    public void onClick(View view) {
        if (view == acceptButton) {
            ...
        }
        else if (view == cancelButton) {
            ...
        }
    }
}

显示对话框没有任何问题。但是我的问题在于myDialog被解雇之后,FragmentA中的onResume()方法从未被调用,并且显示了FragmentA,你可以毫无问题地与它进行交互。

public class FragmentA extends Fragment implements OnClickListener {

    ...

    @Override
    public void onResume() {
        super.onResume();
        resumeFragmentA();
    }
}

因此,我为解决此问题所做的工作是在onActivityCreated()方法的末尾复制FragmentA的实例,并在用户关闭对话框时调用方法resumeFragmentA()

public class FragmentA extends Fragment implements OnClickListener {

    FragmentA fragmentA = null;

    ...

    @Override
    public void onResume() {
        super.onResume();
        resumeFragmentA();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {

        ...

        fragmentA = this;
    }

    ...
}

public class MyDialog extends DialogFragment implements OnClickListener {
    ...
    @Override
    public void onClick(View view) {
        if (view == acceptButton) {
            storeData();
            dismissDialog();
        }
        else if (view == cancelButton) {
            dismissDialog();
        }
    }

    public void dismissDialog() {
        FragmentA.fragmentA.resumeFragmentA();
        dismiss();
    }

}

我知道这个解决方案很棘手,但我不知道以更精彩的方式解决。你知道吗?任何的想法? 提前谢谢!

为了更好地阅读我的代码,请在此处获取完整代码:

public class FragmentA extends Fragment implements OnClickListener {

    ...

    FragmentA fragmentA = null;

    ...

    @Override
    public void OnClick(View v) {
        if (v == dialogButton) {
            showDialog();
        }
    }

    public void showDialog() {
        String diagName = getResources().getString(R.string.dialog_title);
        MyDialog myDialog = MyDialog.newInstance(getFragmentAValue());
        myDialog.show(getFragmentManager(), diagName);
    }

    @Override
    public void onResume() {
        super.onResume();
        resumeFragmentA();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {

        ...

        fragmentA = this;
    }

    ...
}


public class MyDialog extends DialogFragment implements OnClickListener {

    ...

    static MyDialog newInstance(int value) {
        MyDialog fragment = new MyDialog ();
        Bundle args = new Bundle();
        args.putInt("value", value);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onClick(View view) {
        if (view == acceptButton) {
            storeData();
            dismissDialog();
        }
        else if (view == cancelButton) {
            dismissDialog();
        }
    }

    public void dismissDialog() {
        FragmentA.fragmentA.resumeFragmentA();
        dismiss();
    }

    ...

}

3 个答案:

答案 0 :(得分:2)

如果您只想调用FragmentA的onResume,请在DialogFragment中调用startActivityForResult,然后启动FragmentActivity。这将调用onResume。

public void dismissDialog() {
   getActivity().startActivityForResult(getActivity().getIntent(), 10);
   dismiss()
}

答案 1 :(得分:2)

现在Google发布了Android架构组件库,最好的解决方案是在两个片段之间使用共享的ViewModel,将Activity作为实现LifecycleRegistryOwner的片段。

这样做,我们将避免刷新UI调用onResume,我们不需要编写任何棘手的解决方案。

解决方案可能是以下一个:

{{1}}

答案 2 :(得分:0)

另一种方法是实现一个接口。创建一个接口,让activity / fragment(你需要的那个)实现它,然后将自己作为接口对象传递给DialogFragment

CustomDialogFragment df = new CustomDialogFragment();
Bundle b = new Bundle();
b.putSerializable(KEY, this); // current activity/fragment that implements the interface
df.setArguments(b);
df.show(getFragmentManager(), TAG);

然后在你的DialogFragment中获取听众,并在需要时调用听众的方法(在这种情况下,在你调用dismiss()之后/之前)。