开启设备后,当运行 DialogFragment报错

After turning the device, when running DialogFragment error

有一个包含 FAB 和 ViewPager 的片段:

public class PageFragment extends Fragment {
    public static final String ARG_PAGE = "ARG_PAGE";
    private static final String DATE_PICKER_FRAGMENT = "dpf";
    private FloatingActionButton FABAddDay;
    BottomAppBar mBottomAppBar;
    FragmentManager mFragmentManager;
    SampleFragmentPagerAdapter mSampleFragmentPagerAdapter;
    Fragment mDaysListFragment;
    DialogFragment mDatePickerFragment;


    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.tab_layout, container, false);
        ViewPager viewPager = view.findViewById(R.id.viewpager);
        mSampleFragmentPagerAdapter = new SampleFragmentPagerAdapter(getFragmentManager(), getActivity());
        viewPager.setAdapter(mSampleFragmentPagerAdapter);
        mDaysListFragment = DaysListFragment.newInstance();
        mDatePickerFragment = DatePickerFragment.newInstance();
        mFragmentManager = getFragmentManager();
        TabLayout tabLayout = view.findViewById(R.id.sliding_tabs);
        tabLayout.setupWithViewPager(viewPager);
        FABAddDay = view.findViewById(R.id.fab);
        mBottomAppBar = view.findViewById(R.id.bottom_app_bar);
        mBottomAppBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.settings: {
                        Intent intent = new Intent(getActivity(), SettingsActivity.class);
                        startActivity(intent);
                        return true;
                    }
                    default:
                        return true;
                }

            }
        });
        FABAddDay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                mDatePickerFragment.setTargetFragment(mDaysListFragment, DaysListFragment.REQUEST_DATE);
                mDatePickerFragment.show(mFragmentManager, DaysListFragment.DIALOG_DATE);

            }
        });
        return view;
    }




    public class SampleFragmentPagerAdapter extends FragmentPagerAdapter {
        final int PAGE_COUNT = 2;
        private String tabTitles[] = new String[]{"List", "Calendar"};

        public SampleFragmentPagerAdapter(FragmentManager fm, Context context) {
            super(fm);

        }

        @Override
        public int getCount() {
            return PAGE_COUNT;
        }

        @Override
        public androidx.fragment.app.Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return mDaysListFragment;
                case 1:
                    return new CalendarFragment();
                default:
                    return null;
            }


        }

        @Override
        public CharSequence getPageTitle(int position) {

            return tabTitles[position];
        }
    }
}

ViewPager 中的一个片段从 DatePickerFragment(对话框)获取结果并在 onActivityResult 中处理它,一切正常,但是如果您旋转设备然后尝试 运行 DatePickerFragment,一个发生错误:

 Process: com.example.taskplanner, PID: 7851
    java.lang.IllegalStateException: Fragment DatePickerFragment{4d9dc48 (a5fb8e8f-12c0-4f7b-ad26-220f6322d846) dialogDate} declared target fragment DaysListFragment{990eae1 (70133c60-029f-4b23-ad5a-954b0abb630f)} that does not belong to this FragmentManager!
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:805)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

我不明白为什么会这样,我该怎么办?

不太明白为什么会报这个错,好像是重新创建target fragment的问题。我试图保存这个片段,一切正常。

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {

    mFragmentManager.putFragment(outState, "dlf", mDaysListFragment);
    super.onSaveInstanceState(outState);
}

onCreateView:

    if (savedInstanceState!=null){
        mDaysListFragment=  mFragmentManager.getFragment(savedInstanceState, "dlf");
    }
    else
    mDaysListFragment = DaysListFragment.newInstance();