Android-Vollbilddialog-Rückrufproblem

9

Ich habe Probleme, meinen Kopf um etwas zu wickeln, aber lassen Sie mich zuerst mein Setup beschreiben:

Ich habe eine Aktivität, die auf 3 Fragmente verweist, von denen jede zum richtigen Zeitpunkt angezeigt wird. So sieht das ChildrenSpecificationFragment aus:

Wenn der Benutzer auf die unverankerte Aktionsschaltfläche klickt, wird das folgende DialogFragment geöffnet:

Ich habe die folgenden Informationen in den neuen Richtlinien für das Materialdesign gefunden: Ссылка

  

Vermeiden Sie Dialoge, die:   Öffnen Sie zusätzliche Dialoge innerhalb eines Dialogs.   Enthält scrollende Inhalte, insbesondere Warnungen. Betrachten Sie stattdessen alternative Container oder Layouts, die für das Lesen oder die Interaktion mit erheblichen Mengen von Inhalten optimiert sind.

     

Ausnahmen: Vollbilddialoge können zusätzliche Dialoge öffnen, z. B. Picker, da ihr Design zusätzliche Materialschichten enthält, ohne die wahrgenommene Z-Tiefe oder das visuelle Rauschen der App wesentlich zu erhöhen.

Hier beginnen meine Probleme. Das Dialogfeld "Kind hinzufügen" enthält einen bildlauffähigen Inhalt (im Querformat). Wenn der Benutzer auf "Geburtsdatum" klickt, wird eine Datumsauswahl geöffnet.

Ich versuche einen Weg zu finden, um einen Vollbilddialog (wie in den Richtlinien) zu implementieren, der einen Rückruf zu ChildrenSpecificationFragment hat, so dass ich das Kind zum RecyclerView hinzufügen kann.

Ich hoffe, dass meine Suche klar ist und ich würde mich über jeden Input freuen, der mich zur Lösung führen würde. Vielen Dank im Voraus!

    
Jdruwe 06.06.2015, 15:03
quelle

4 Antworten

0

Ich sehe keinen Code von Ihrem Post. Also ich rate deine Code-Struktur als Anfang. Erstellen Sie zuerst Ihren Dialog mit einem Listener und verarbeiten Sie setPositiveButton () und das Ereignis onClick.

Code Vorschlag:

%Vor%

Anmerkungen:

  • SubChildFragment zum Beispiel ist eine innere Klasse, die von Fragment abgeleitet ist. Es kann die öffentliche Methode passData () in der äußeren Klasse ChildrenSpecificationFragment aufrufen, um alle benötigten Daten zu übergeben.
  • Ich benutze eine innere Klasse, weil ich denke, dass Sie das mit
  • in Ihrem Diagramm meinten
  

Fügen Sie ein untergeordnetes Vollbildfragment hinzu

  • Diese Codierungstechnik ist einfacher als das Starten einer neuen Aktivität und Absicht.

Zum Anzeigen von Vollbilddialogen gibt es eine gute Google-Webseite, die ich glaube Dialog - Vollbild . Suchen Sie nach Text für "Einen Vollbild-Dialog anzeigen oder als eingebettetes Fragment".

    
The Original Android 01.07.2015, 01:22
quelle
3

TL; DR - DialogFragment reicht für nichts anderes als vollständig im Vollbildmodus aus. Verwenden Sie stattdessen eine Aktivität.

Es ist möglich, einen DialogFragment Vollbildschirm zu machen (mit dem ActionBar gezeigt), aber es kommt mit vielen Irritationen.

A DialogFragment ist, wie der Name schon sagt, ein Dialog und ein Fragment in einem zusammengefasst: es kann sowohl als Dialog behandelt werden, als auch als show() und dismiss() , oder als Fragment , benutze es mit FragmentManager .

Wie die offizielle Dokumentation suggeriert , wird ein Dialog vollständig im Vollbildmodus (überlagert Alles wird erreicht, indem der Dialog an die Root-Ansicht android.R.id.content :

angehängt wird %Vor%

Damit der Dialog unterhalb von ActionBar erscheint, ist ein FrameLayout erforderlich, das anstelle des Root-Layouts verwendet wird:

%Vor%

Jetzt kommt der Schmerz.

Je nachdem, wie die Hauptnavigation der App eingerichtet ist, müssen verschiedene Creops durchlaufen werden, damit alles perfekt funktioniert.

Das obige Beispiel hat eine NavigationView . Da die Home-Schaltfläche android.R.id.home in der Hauptansicht behandelt wird, wird dort eine Logik benötigt, um zu prüfen, ob unser Dialog angezeigt wird, so dass die Home-Schaltfläche, die nun ein X ist, den Dialog schließt. Die Rückgabe von false hier erlaubt die Behandlung des Ereignisses im Dialog.

%Vor%

Auch die Zurück-Schaltfläche benötigt eine ähnliche Logik, um zu bestimmen, ob% code_% das Schließen oder%% das Zurücksetzen des Inhaltes erfordert.

%Vor%

In NavigationView selbst muss die Logik zum Schließen des Dialogs (und dem Missbrauch von ActionBar ) implementiert werden.

%Vor%

Das alles fühlt sich wirklich kludgy an. Natürlich, wenn Sie DialogFragment verwenden, vergessen Sie alles, was ich gerade gesagt habe.

Mit ActionBar können Sie einfach alles in TabLayout verarbeiten, aber wenn Sie TabLayout verwenden, ist es unmöglich, den Dialog auf die Registerkarten zu legen, aber nicht auf die Aktionsleiste. Siehe DialogFragment über TabLayout anzeigen .

Diese Frage (von mir) hat eine Antwort, die dasselbe wie @Jdruwe nahelegt, nämlich die Hoffnungslosigkeit von DialogFragment zu vergessen und statt dessen ViewPager zu verwenden.

    
Jon 01.07.2015 06:53
quelle
1

Eine Lösung, die in meinem Blog mit startActivityForResult (...) beschrieben wird: Ссылка

    
Jdruwe 23.06.2015 10:09
quelle
0

fügen Sie diese Zeile in Ihrem benutzerdefinierten Dialogfragment zu oncreate hinzu.

%Vor%

Auf der anderen Seite können Sie Content Resolver verwenden, um Ihre untergeordneten Daten zu speichern. Es hat Beobachtermuster. Jeder CursorAdapter, der an diesen Inhalt angehängt ist, aktualisiert sich also selbst, ohne notifySetDataChanged(); aufzurufen.

Ich denke, Sie verwenden RecyclerView.Adapter. Sie können diese Klasse verwenden

Ein weiterer Hinweis zum Implementieren des Hinzufügens von untergeordneten Features ist die Verwendung von startActivityForResult(activity); . Sie können Daten mithilfe von getIntent().getExtras().put(key,value); zurücksenden. Sie können nach benutzerdefinierten Startaktivitäten für das Ergebnis suchen.

Viel Glück

    
Emre Aktürk 06.06.2015 15:18
quelle