MainActivity-Methode ausführen nach Schließen eines DialogFragments

  • Antworten:7
  • Bentwortet
Frank Rudolf
  • Forum-Beiträge: 215

04.02.2016, 12:53:17 via Website

Ich werde wohl noch parallel nach einer guten Umsetzung dieser Frage recherchieren. Dennoch möchte ich auch Euch fragen.

Eine ListView zeigt mir zB Städte an:

image
Dieser ListView kann ich neue Städte hinzufügen, indem ich den neuen Städtenamen über ein Dialogfragment annehme und in einer Textdatei speichere:

image

Ich möchte nun diese Liste aktualisieren, sodass sie nach dem Hinzufügen des neuen Datensatzes diesen auch in der ListView anzeigt. Auf das Beispiel bezogen möchte ich Regensburg in der Liste sehen.

Ich plane das zunächst so umzusetzen:
Im DialogFragment gibt es gewisse Ereignismethoden, die mit "on" beginnen (zB onPause etc.). Hier wähle ich ein Ereignis aus, dass ausgeführt wird, wenn ich den Dialog mit Dismiss() schließe.

Anschließend möchte ich weiteren Code in der MainActivity ausführen: Die Datenbasis für den ListViewAdapter muss aktualisiert werden. Den Kleinkram hierfür kläre ich schon selbst. Mir würde zu Testzwecken schon genügen, wenn nach dem Schließen des DialogFragement eine Methode der MainActivity ausgeführt wird, die zB lediglich einen Toast bringt.

Ich vermute, dass ich in diesem Zusammenhang mit einem Listener arbeiten muss, der die MainActivity darüber informiert, dass das DialogFragment seine Arbeit nun abgeschlossen hat.

Vielleicht habt Ihr ja Anregungen und Tipps, wie ich das umsetzen kann. Links auf gute Seiten mit Beispielen sind mir auch immer willkommen.

— geändert am 04.02.2016, 12:54:48

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.02.2016, 12:58:06 via Website

Listener/Callback klingt doch schonmal gut, damit geht es :)

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
Henrik Martens
  • Forum-Beiträge: 607

04.02.2016, 13:10:26 via Website

Ich würde hier über eine Methode des DialogFragment gehen (on....) evenetuell auch über das onClick() Ereigniss des Buttons.

Dann den ListView unsichtbar machen, das Array ändern aus dem sich der Adapter bedient, und dann den ListView wieder auf Visible.

Frank Rudolf

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.02.2016, 13:12:37 via App

Genau wird das einfachste sein

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

04.02.2016, 15:04:56 via Website

Du solltest die MainActivity aber über getActivity() erst beim Event, oder in onAttach() holen.
Die Activity wird z.B. bei Rotation neu instanziert und wenn man sie auf anderem Wege übergibt, ist die übergebene Instanz nach einer Drehung des Geräts tot.

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

04.02.2016, 16:08:20 via Website

Meine erste Umsetzung wurde mit einem Fehler belohnt :(.

Hier erst mal meine Maßnahmen:

Zu Beginn des Fragments folgendes:

public class DialogFragment_New extends DialogFragment {
    DialogFragment_NewReady mCallback;

    public interface DialogFragment_NewReady {
         void Update();
    }

    public void onPause(Activity activity) {
        super.onAttach(activity);

        try {
            mCallback = (DialogFragment_NewReady) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement DialogFragment_NewReady");
        }
    }

Im Fragment kommt dann an m. E. passender Stelle:

dismiss();

mCallback.Update();

Die letzte Zeile verursacht dann übrigens den Fehler:

java.lang.NullPointerException: Attempt to invoke interface method
'void
MeinPackageName.DialogFragment_New$DialogFragment_NewReady.Update()'
on a null object reference

Aber noch zum Schluss die beiden MainActivity-Stellen:

public class MainActivity extends AppCompatActivity implements DialogFragment_New.DialogFragment_NewReady

...

@Override
    public void Update() {
        Log.d("Meldung","Interface geht");
    }

Vielleicht ist onPause das falsche Ereignis?

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

04.02.2016, 17:24:01 via Website

Geht nun.

onPause kennt ein Dialogfragment wohl nicht (!?).

Habe ein override hinzugefügt und onAttach gewählt:

@Override
    public void onAttach(Activity activity) {

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

04.02.2016, 21:37:52 via Website

Natürlich kennt es das, aber schau Dir doch bitte mal in welcher Reihenfolge diese Lifecycle-Methoden durchlaufen werden,
dann wird der Fehler klar. Du willst doch den Listener verbinden, wenn der Dialog sich öffnet, nicht wenn es sich schließt.

Außerdem würde ich mir in Java zumindest die Standard-Schreibweise für Klassennamen und Methoden angewöhen.
Klassennamen beginnen mit Großbuchstaben, Methoden mit Kleinbuchstaben, der Rest in beiden Fällen Camel-Case.

MeineTolleKlasse
meineTolleMethode

Dann wird Dein Code deutlich leichter lesbar. Vor allem für Außenstehende, die versuchen darin ein Problem zu finden :)

Frank Rudolf

Antworten