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.