Mostrar el cuadro de diálogo sobre el buscapersonas que tiene fragmentos anidados

He configurado un proyecto de prueba muy simplehttps://github.com/ArtworkAD/ViewPagerDialogTest para evaluar la siguiente situación: la actividad principal tiene un buscapersonas que aloja un solo fragmento utilizando el administrador de fragmentos de soporte:

public class MainActivity extends AppCompatActivity {

    // ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        viewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));
        // ...
        tabLayout.setupWithViewPager(viewPager);
    }

    @Override
    protected void onResume() {
        super.onResume();

        MainActivity.CustomDialog dialog = (MainActivity.CustomDialog) getSupportFragmentManager().findFragmentByTag(MainActivity.CustomDialog.TAG);

        if (dialog == null) {
            new MainActivity.CustomDialog().show(getSupportFragmentManager().beginTransaction(), MainActivity.CustomDialog.TAG);
        }
    }
    // ...
}

Cuando se reanuda la actividad, se muestra un fragmento de diálogo dentro de la actividad principal.

El fragmento único dentro del buscapersonas se define así:

public class RootFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.root_fragment, container, false);
        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction().add(R.id.root_frame, new FirstLevelFragment(), "ROOT").commit();
        }
        return root;
    }
}

Este fragmento raíz nos permite apilar otros fragmentos en el "root_frame". Entonces apilamos otro y otro:

public class FirstLevelFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        setRetainInstance(true);
        View root = inflater.inflate(R.layout.first_level_fragment, container, false);
        root.findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SecondLevelFragment f = (SecondLevelFragment) getActivity().getSupportFragmentManager().findFragmentByTag("NESTED");
                if (f == null) {
                    getActivity().getSupportFragmentManager().beginTransaction().add(R.id.root_frame, new SecondLevelFragment(), "NESTED").addToBackStack(null).commit();
                }
            }
        });
        return root;
    }

    public static class SecondLevelFragment extends Fragment {

        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            setRetainInstance(true);
            return inflater.inflate(R.layout.second_level_fragment, container, false);
        }
    }
}

¡Esto funciona muy bien! La idea de apilamiento se toma dehttps://stackoverflow.com/a/21453571/401025 . Sin embargo, cuando se muestra el diálogo y los usuarios van al fragmento de segundo nivel y giran la pantalla, aparece la siguiente excepción:

E / AndroidRuntime: java.lang.RuntimeException: no se puede iniciar la actividad ComponentInfo {de.azzoft.viewpagerdialogtest / de.azzoft.viewpagerdialogtest.MainActivity}: java.lang.IllegalArgumentException: No se encontró ninguna vista para el ID 0x7f0c0083 (de.azzoft.view: de.azzoft.view: id / root_frame) para el fragmento SecondLevelFragment {15c0db38 # 0 id = 0x7f0c0083 NESTED}

E / AndroidRuntime: Causado por: java.lang.IllegalArgumentException: No se encontró vista para el id 0x7f0c0083 (de.azzoft.viewpagerdialogtest: id / root_frame) para el fragmento SecondLevelFragment {15c0db38 # 0 id = 0x7f0c0083 NESTED}

Seguimiento de pila completa:https://github.com/ArtworkAD/ViewPagerDialogTest/blob/master/README.md

Sin el diálogo que aparece todo funciona muy bien. Puede probarlo descargando el proyecto de prueba.

Parece que el diálogo, que en realidad es un fragmento, desordena la jerarquía de fragmentos cuando se agrega a la actividad. Alguna idea de cómo solucionar este problema?

Es importante que se retenga el segundo fragmento.

Respuestas a la pregunta(5)

Su respuesta a la pregunta