Dialog über Ansichtspager mit verschachtelten Fragmenten anzeigen

ch habe ein sehr einfaches Testprojekt eingerichthttps: //github.com/ArtworkAD/ViewPagerDialogTes, um die folgende Situation zu bewerten: Die Hauptaktivität verfügt über einen View-Pager, der ein einzelnes Fragment mithilfe des Support-Fragment-Managers hostet:

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

Wenn die Aktivität fortgesetzt wird, wird ein Dialogfragment in der Hauptaktivität angezeigt.

Das einzelne Fragment im View-Pager ist wie folgt definiert:

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

Dieses Root-Fragment ermöglicht es uns, andere Fragmente auf dem "root_frame" zu stapeln. Also stapeln wir noch einen und noch einen:

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

Das funktioniert super! Die Stapelidee stammt vonhttps: //stackoverflow.com/a/21453571/40102. Wenn jedoch ein Dialogfeld angezeigt wird und die Benutzer zum Fragment der zweiten Ebene wechseln und den Bildschirm drehen, erhalte ich die folgende Ausnahme:

E / AndroidRuntime: java.lang.RuntimeException: Aktivität ComponentInfo {de.azzoft.viewpagerdialogtest / de.azzoft.viewpagerdialogtest.MainActivity} kann nicht gestartet werden: java.lang.IllegalArgumentException: Keine Sicht für ID 0x7f0c0083 (de.azzoft.testpager.view : id / root_frame) für das Fragment SecondLevelFragment {15c0db38 # 0 id = 0x7f0c0083 NESTED}

E / AndroidRuntime: Auslöser: java.lang.IllegalArgumentException: Keine Ansicht für ID 0x7f0c0083 (de.azzoft.viewpagerdialogtest: id / root_frame) für Fragment SecondLevelFragment {15c0db38 # 0 id = 0x7f0c0083 NESTED} gefunden

Vollständiger Stack-Trace:https: //github.com/ArtworkAD/ViewPagerDialogTest/blob/master/README.m

Ohne den erscheinenden Dialog funktioniert alles prima. Sie können es testen, indem Sie das Testprojekt herunterladen.

Es scheint, dass der Dialog, der eigentlich ein Fragment ist, die Fragmenthierarchie durcheinander bringt, wenn er der Aktivität hinzugefügt wird. Irgendwelche Ideen, wie man das behebt?

Es ist wichtig, dass das zweite Fragment erhalten bleibt.

Antworten auf die Frage(10)

Ihre Antwort auf die Frage