你以一个Android专家的身份,在使用FragmentDialog时弹窗隐藏报错,分析下received Fragment#onDestory() callback and Fragment # mFragmentManager is null,是什么原因导致的,并给出解决方法帮我封装个继承DialogFragment的类,重写一些方法,增加新的show/hide方法,避免出现这个问题。
时间: 2024-02-09 11:09:30 浏览: 34
在使用FragmentDialog弹窗时,如果弹窗被隐藏的时候出现了"received Fragment#onDestory() callback and Fragment # mFragmentManager is null"的错误,通常是因为在弹窗隐藏时没有正确地处理FragmentManager的引用所导致的。为了避免这个问题,可以自定义一个继承DialogFragment的类,并重写一些方法,增加新的show/hide方法。
首先,我们需要自定义一个继承DialogFragment的类,例如MyDialogFragment,并在其中添加一个成员变量mFragmentManager来保存FragmentManager的引用,代码如下:
```
public class MyDialogFragment extends DialogFragment {
private FragmentManager mFragmentManager;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mFragmentManager = getActivity().getSupportFragmentManager();
}
@Override
public void onDetach() {
super.onDetach();
mFragmentManager = null;
}
}
```
接下来,我们需要重写DialogFragment的show和dismiss方法,以确保在弹窗显示和隐藏时能够正确地处理FragmentManager的引用。代码如下:
```
public class MyDialogFragment extends DialogFragment {
private FragmentManager mFragmentManager;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mFragmentManager = getActivity().getSupportFragmentManager();
}
@Override
public void onDetach() {
super.onDetach();
mFragmentManager = null;
}
@Override
public void show(FragmentManager manager, String tag) {
if (mFragmentManager != null) {
mFragmentManager.executePendingTransactions();
}
super.show(manager, tag);
}
@Override
public void dismiss() {
if (mFragmentManager != null) {
mFragmentManager.executePendingTransactions();
}
super.dismiss();
}
public void showAllowingStateLoss(FragmentManager manager, String tag) {
if (mFragmentManager != null) {
mFragmentManager.executePendingTransactions();
}
super.showAllowingStateLoss(manager, tag);
}
public void hide() {
if (mFragmentManager != null) {
mFragmentManager.executePendingTransactions();
}
super.dismiss();
}
}
```
通过重写DialogFragment的show和dismiss方法,并添加新的showAllowingStateLoss和hide方法,我们可以确保在弹窗显示和隐藏时能够正确地处理FragmentManager的引用,从而避免出现"received Fragment#onDestory() callback and Fragment # mFragmentManager is null"的错误。
使用MyDialogFragment时,只需要调用它的show和hide方法即可,例如:
```
MyDialogFragment dialogFragment = new MyDialogFragment();
dialogFragment.show(getSupportFragmentManager(), "tag");
...
dialogFragment.hide();
```
通过以上方法,我们可以自定义一个继承DialogFragment的类,并增加新的show/hide方法,避免出现"received Fragment#onDestory() callback and Fragment # mFragmentManager is null"的错误。