Mostrar caixa de diálogo acima da visualização do pager que contém fragmentos aninhados

Eu configurei um projeto de teste muito simpleshttps://github.com/ArtworkAD/ViewPagerDialogTest para avaliar a seguinte situação: a atividade principal possui um pager de exibição que hospeda um único fragmento usando o gerenciador de fragmentos de suporte:

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);
        }
    }
    // ...
}

Quando a atividade é retomada, um fragmento de diálogo é mostrado dentro da atividade principal.

O único fragmento dentro do pager da visualização é definido assim:

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 raiz nos permite empilhar outros fragmentos no "root_frame". Então empilhamos outro e outro:

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);
        }
    }
}

Isso funciona muito bem! A ideia de empilhamento é retirada dehttps://stackoverflow.com/a/21453571/401025 . No entanto, quando a caixa de diálogo é mostrada e os usuários vão para o fragmento de segundo nível e giram a tela, recebo a seguinte exceção:

E / AndroidRuntime: java.lang.RuntimeException: Não foi possível iniciar a atividade ComponentInfo {de.azzoft.viewpagerdialogtest / de.azzoft.viewpagerdialogtest.MainActivity}: java.lang.IllegalArgumentException: nenhuma visualização encontrada para o ID 0x7f0c0083 (de.azzoft.viewpagerdialogtest: id / root_frame) para o fragmento SecondLevelFragment {15c0db38 # 0 id = 0x7f0c0083 NESTED}

E / AndroidRuntime: Causado por: java.lang.IllegalArgumentException: Nenhuma visualização encontrada para o ID 0x7f0c0083 (de.azzoft.viewpagerdialogtest: id / root_frame) para o fragmento SecondLevelFragment {15c0db38 # 0 id = 0x7f0c0083 NESTED}

Rastreio de pilha completa:https://github.com/ArtworkAD/ViewPagerDialogTest/blob/master/README.md

Sem a caixa de diálogo exibida, tudo funciona muito bem. Você pode testá-lo baixando o projeto de teste.

Parece que a caixa de diálogo, que na verdade é um fragmento, atrapalha a hierarquia do fragmento quando é adicionada à atividade. Alguma idéia de como corrigir isso?

É importante que o segundo fragmento seja retido.

questionAnswers(5)

yourAnswerToTheQuestion