Dialog Fragment in Android

Wenn man Dialoge in Android benutzen will muss man sie als Fragment an die Activity anbinden.
Die beste Möglichkeit um zwischen Dialog und Activity oder Fragment (an die Activity angebunden, in dem Beispiel RecordDetailFragment) zu kommunizieren sind Callbacks.

Das interface EditDateDialogListener beschreibt 2 Funktionen:
public void onDialogPositiveClick(DialogFragment dialog);
public void onDialogNegativeClick(DialogFragment dialog);
In der Klasse die den Dialog anhängen möchte implementiert man das Interface EditDateDialogListener (public class RecordDetailFragment extends SherlockFragment implements EditDateDialogFragment.EditDateDialogListener).
Die Callbacks sorgen dafür, dass der gesamte Dialog an die Activity zurückgegeben und dort verwendet werden kann.
Diese werden abhängig vom gedrückten Button an die implementierende Klasse geschickt.
Das größte Problem ist die Verbindung von Dialog und angebundener Activity:
Die Activity wird neu erstellt, wenn das Gerät z.B. gedreht wird. Der Dialog schickt nun seine Daten an die nicht mehr vorhandene Activity.
Daher muss diese Verbindung konsistent gehalten werden. Dafür sorgt die setListener Methode, die aufgerufen werden muss sobald man den Dialog anhängt und bei jedem Drehen des Displays (in der onCreate methode implementiert).

Das Beispiel ist nicht ausreichend erklärt – am besten einbauen und mit dem Debugger durchsteppen.
Es gibt einen guten Guide von Android, der Dialogs erklärt. Speziell habe ich auf die Kommunikation verlinkt. Mein Beispiel unterscheidet sich nicht groß, bis auf das konsistent halten der Callbacks.
Android empfiehlt übrigens solche Abhängigkeiten mit Callbacks zu realisieren.
Außerdem benutzte ich die ActionBarSherlock Library – deshalb die veränderten Activity-Klassen.
Eine falsche Implementierung des Dialogs kann man in der App AdAway sehen. Lädt man die host Einträge herunter erscheint nach Fertigstellung ein Dialog. Dreht man das Gerät verschwindet der Dialog. Offensichtlich besteht keine konsistente Verbindung zwischen Activity und Dialog, die bei uns die setListener übernimmt. Ich kenne den Code nicht und weiß nicht ob Callbacks verwendet wurden, jedoch verhält es sich so, wenn man die Verbindung nicht konsistent hält. Getestet in der AdAway Version 2.0 (39)

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

  2 comments for “Dialog Fragment in Android

  1. Toni
    14th July 2015 at 23:10

    Danke, ist eine gute Erklärung. Mir ist nur nicht klar, wie die MainActivity aussehen muss.
    Am liebsten hätte ich soviel wie möglich in Klassen verpackt, damit ich nicht so viel Code in der jeder
    Activity habe. Vielleicht hast Du auch ein komplettes Beispiel bereit.
    Warum ist das nur so kompliziert, in anderen Umgebungen ist das ein 3-Zeiler 🙁
    Vielleicht gelingt es mir das Ganze in Design Patterns zu realisieren.

    LG

    • No3x
      15th July 2015 at 19:00

      Hallo, das Benutzen der Klasse ist einfach: Zunächst implementierst du das Interface (hier EditDateDialogFragment.EditDateDialogListener) des Dialogs in deiner Activity oder deinem Fragment, anschließend erstellst du einen Dialog wie folgt (z.B. bei Klick auf einen Button):

      wobei ich gerade bemerke, dass die Benutzung doch bereits im Artikel beschrieben ist.

      Jedoch muss ich auch sagen, dass dieser Artikel schon älter ist und ich seither wenig mit Android zu tun hatte. Andererseits habe ich ein paar Libraries (wie Sweet Alert Dialog oder Android Styled Dialogs) mitbekommen, die sich dem Erstellen von Dialogen annehmen. Außerdem wurde AppCompatDialog in die Android Support Library eingepflegt. Der beste Startpunkt sollten die genannten Libraries + Open Source Apps als Referenz sein. Zum finden von Libraries empfehle ich https://android-arsenal.com/.

      LG No3x

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Spelling error report

The following text will be sent to our editors: