Вложенный DialogFragment: getChildFragmentManager () и getParentFragment () завершаются ошибкой в ​​Oreo 8.0->? - PullRequest
0 голосов
/ 11 сентября 2018

В моем существующем приложении у меня есть действие, использующее getFragmentManager () при создании ParentDialogFragment, и там я создаю вложенный фрагмент Dateselect_NestedDialogFragment, используя getChildFragmentManager.

Приложение работало, но начиная с Android 8.0 -> начало падать.Лучшее, что я нашел: «Почему Android O не работает с« не относится к этому FragmentManager! » и « getParentFragment возвращает ноль », но я все еще не понимаю, каквезде используйте один и тот же фрагмент-менеджер (и какой!), как Мне нужно отправить данные обратно из вложенного DialogFragment в ParenDialogtFragment . Где эти изменения в моем коде должны быть сделаны? Или кто-нибудь знает какую-либо ссылку на Oreo-работающий образец-проект, куда данные отправляются обратно из вложенного в родительский фрагмент диалога? Спасибо за любой совет =)

CODE snap:
---------------------------------------------------
In MainActivity I create 1st level DialogFragment:
        FragmentManager fm = getFragmentManager();
        ParentDialogFragment dialogFragment = ParentDialogFragment.newInstance(-1);
        dialogFragment.show(fm, "NEW...");
-----------------------------------------------     
In ParentDialogFragment I create 2nd level DialogFragment:
        ft = getChildFragmentManager().beginTransaction();
        //ft=getActivity().getFragmentManager().beginTransaction(); TRIED E.G. THIS TOO...
        ft.addToBackStack(null);
        newFragment = Dateselect_NestedDialogFragment.newInstance("klikattu_pvm");
        newFragment.setTargetFragment(this, DIALOG_FRAGMENT_DATESELECT);
        newFragment.show(ft, "dateselect_dialog");
        ...
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        switch(requestCode)
        {
            case DIALOG_FRAGMENT_DATESELECT:
                if (resultCode == Activity.RESULT_OK)
                {
                    if (data.getStringExtra("klikattu_pvm")!=null)
                    {
                        muokattavaHavainto.sHav_pvm = data.getStringExtra("klikattu_pvm");
                        blaablaa
                    }
                }
                break;
        }
    }
----------------------------------------
In Dateselect_NestedDialogFragment:
cal.setOnDateChangeListener(new CalendarView.OnDateChangeListener()
        {
            public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth)
            {
                if (cal.getDate() != date)
                {
                    Intent intent = new Intent(getParentFragment().getActivity(), ParentDialogFragment.class);

                    SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
                    String sPvm = df.format(cal.getDate());
                    String sPrefname = getArguments().getString("dateprefname");
                    intent.putExtra(sPrefname, sPvm);

                    getParentFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);
                    dismiss();
                }
            }
        });
--------------------------------------------

При попытке открыть Dateselect_NestedDialogFragment -> причины java.lang.IllegalStateException: Fragment Dateselect_NestedDialogFragment {5d534# 0 dateselect_dialog} объявленный целевой фрагмент ParentDialogFragment ..., который не принадлежит этому FragmentManager!

Изменение на ft = getActivity (). GetFragmentManager (). BeginTransaction (); в ParentDialogFragment -> reason 'java.lang.NullPointerException: попытка вызватьвиртуальный метод 'android.app.Activity android.app.Fragment.getActivity ()' для нулевой ссылки на объект ' в Dateselect_NestedDialogFragment после выбора даты в getParentFragment (). getActivity ()

...