[ERLEDIGT] AlertDialog.Builder: 2x Tippen um Dialog zu schließen

lordzwieback

lordzwieback

Erfahrenes Mitglied
210
Moin,

folgendes Problem: Ich habe in meiner ActionBar in der MainActivity zwei Menüeinträge (hinzufügen, löschen).

Beim Klick auf eines der Symbole öffnet sich ein kleiner Dialog. Beim "Hinzufügen"-Dialog habe ich ein Layout mit zwei EditTexts drangehangen. Der "Löschen"-Dialog besteht nur aus einer Message und den Positive und NegativeButtons.

Nun habe ich folgendes festgestellt: Wenn ich den Hinzufügen-Dialog aufrufe und auf Abbrechen klicke, muss ich das immer 2x machen, damit der Dialog verschwindet. Beim Löschen-Dialog passiert das komischerweise nicht.

Hier mal der Code der Methode, die den Dialog zusammenbaut..
Code:
// CREATE DIALOG BOX WITH EDITTEXT
    private AlertDialog addDialog(final Context context) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        LayoutInflater inflater = MainActivity.this.getLayoutInflater();

        View layout = inflater.inflate(R.layout.dialogbox, null);
        builder.setView(layout);

        final EditText rssLink = (EditText) layout.findViewById(R.id.addRssLink);
        final EditText feedName = (EditText) layout.findViewById(R.id.addFeedName);

        builder.setPositiveButton("add", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (!rssLink.getText().toString().equals("")) {
                    LinkDB.getInstance(context).insert(rssLink.getText().toString(), feedName.getText().toString());
                } else {
                    Toast toast = Toast.makeText(context, "Bitte gültigen Link angeben", Toast.LENGTH_SHORT);
                    toast.show();
                    return;
                }
            }
        });

        builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                return;
            }
        });

        return builder.create();
    }

Die Methode, die den Dialog anzeigt...
Code:
private void addNewRSSLink() {
        AlertDialog dialog = addDialog(this);
        dialog.show();
    }


Hat jemand ne Idee, woran das hängen könnte?
 
Hast du es mal mit dismiss anstatt return versucht?
 
Hi deka, danke für die Antwort. Werd ich später ausprobieren, melde mich heute noch.
 
Fangen wir mal von vorne an

1. Statt den LayoutInflater von der Activtiy zu holen, kannst du
Code:
LayoutInflater inflater = LayoutInflater.from(context);
aufrufen. Damit bist du schon mal unabhängiger von einer Activity instance. Du brauchst lediglich einen Context, den du zum Glück schon übergibst.

2. Benutze doch mal bitte den Builder wie ein Builder
Code:
return new AlertDialog.Builder(context)
        .setView(layout)
        .setPositiveButton("add", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (!rssLink.getText().toString().equals("")) {
                    LinkDB.getInstance(context).insert(rssLink.getText().toString(),
                            feedName.getText().toString());
                } else {
                    Toast toast = Toast.makeText(context, "Bitte gültigen Link angeben",
                            Toast.LENGTH_SHORT);
                    toast.show();
                    return;
                }
            }
        })
        .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                return;
            }
        })
        .create();

3. Benutzt du keine lambdas? :D

4. Warum rufst du return auf? Selbst AS sagt dir, dass das sinnlos ist.
Bildschirmfoto 2017-08-08 um 14.51.21.png

5. Du brauchst keinen Listener setzten, wenn du nichts machst. Du kannst auch null übergeben.

6. Benutze *nicht* dissmiss in dem OnClickListener. Normalerweise () sollte der Dialog automatisch schließen sobald auf ein Button geklickt wurde.

7. Welchen AlertDialog benutzt du? android.support.v7.app oder android.app?
Bildschirmfoto 2017-08-08 um 14.53.57.png
 
  • Danke
Reaktionen: lordzwieback und swa00
Und wenn du dann noch den Dialog in ein DialogFragment einbettest, bist du auf der richtigen Seite. Objekte mit einen eigenen Window sollten am besten einen eigenen Lifecycle haben.
DialogFragment | Android Developers
 
  • Danke
Reaktionen: lordzwieback
Also, erstmal sorry dass ich so lange gebraucht habe, um das Ganze zu testen. Habe momentan Urlaub und kam nicht dazu.

@StefMa
Ich habe den Dialog Builder deinem Beispiel entsprechend umgebaut (siehe Code weiter unten).
Nein, ich benutze keine Lambdas.
Ja, das mit dem Return war irgendwie doof von mir.
Ich benutze die android.app.AlertDialog.

@markus.tullius
Ich habe dem Link entsprechend ein DialogFragment mit einem AlertDialog erstellt. Das Ganze sieht so aus:
Code:
public class AddLinkFragment extends DialogFragment {

    public static AddLinkFragment newInstance() {
        AddLinkFragment fragment = new AddLinkFragment();
        return fragment;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setTitle("RSS Link hinzufügen")
                .setView(R.layout.dialogbox)
                .setPositiveButton("hinzufügen", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ((MainActivity)getActivity()).doPositiveClick();
                    }
                })
                .setNegativeButton("abbrechen", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ((MainActivity)getActivity()).doNegativeClick();
                    }
                })
                .create();
    }
}

In meiner MainActivity rufe ich das DialogFragment folgendermaßen auf und implementiere die Click-Methoden:
Code:
void showAddDialog() {
        AddLinkFragment fragment = AddLinkFragment.newInstance();
        fragment.show(getFragmentManager(), "dialog");
    }

    public void doPositiveClick() {
        Log.i("TEST", "Es wurde ja geklickt");
    }

    public void doNegativeClick() {
        Log.i("TEST", "Es wurde nein geklickt");
    }

Die Methode showAddDialog() wird dann dementsprechend dort aufgerufen, wo der Dialog gebraucht wird. Das funktioniert auch super soweit, ich bekomme die Log-Ausgaben korrekt angezeigt. Nur ist es immer noch so, dass der Dialog anscheinend 2x erscheint/aufgerufen wird, wie auch immer.
Wenn ich zB den Dialog aufrufe und ihn per "Abbrechen" beenden möchte, muss ich 2x klicken. Das sieht man dann natürlich auch im Log, da die Meldung 2x erscheint.

Was mache ich da noch falsch? :x
[doublepost=1502374790,1502373628][/doublepost]Habe das gerade nochmal nachgeprüft. Ich habe auch für meinen Delete Dialog, den ich vorher in der MainActivity zusammengebaut habe ein DialogFragment erstellt (nach dem gleichen Schema wie oben schon). Dann habe ich in beide newInstance()-Methoden eine Logmeldung gesetzt.

Rufe ich jetzt den Dialog fürs Löschen auf, erscheint 1x die newInstance() Log Meldung. Beim Dialog fürs Hinzufügen wird die newInstance()-Methode 2x aufgerufen. Beide DialogFragments sind nach dem gleichen Schema aufgebaut und werden auch gleich aufgerufen.

Vielleicht hilft das ja weiter... :confused2:
[doublepost=1502375464][/doublepost]Habe den (absolut banalen) Fehler gefunden...
Ich hatte vorher in meinem MainMenu meiner MainActivity nur einen Eintrag (add). Folgendermaßen hatte ich zum testen in die onOptionsItemSelected Methode das hier eingebaut:
Code:
if (item.getItemId() == R.id.addLink) {
    addNewRSSLink();
}

Als der nächste Button fürs delete dazu kam, habe ich (bzw. wollte ich) die if Abfrage mit einem Case ersetzen. Den Case hab ich eingebaut, aber die if-Abfrage (warum auch immer) nicht auskommentiert bzw. gelöscht.

Somit wurde die addNewRSSLink()-Methode in der onOptionsItemSelected fälschlicherweise 2x aufgerufen und mir ist es nicht aufgefallen.

Aber hatte ja doch was Gutes, jetzt weiß ich über DialogFragments auch mal Bescheid. Danke für die Hilfe und die Tipps :D
 
  • Danke
Reaktionen: markus.tullius
:thumbsup:
Nicht auszusetzen!

Nochmal danke, dass du den kompletten Code noch mal veröffentlicht hast.
 
  • Danke
Reaktionen: lordzwieback

Ähnliche Themen

S
  • SlayNox
Antworten
0
Aufrufe
686
SlayNox
S
A
  • AnimaAngelo85
Antworten
1
Aufrufe
337
swa00
swa00
W
  • waltsoft
Antworten
4
Aufrufe
942
waltsoft
W
Zurück
Oben Unten