821 Stimmen

Wie kann man verhindern, dass ein Dialog geschlossen wird, wenn eine Schaltfläche angeklickt wird?

Ich habe einen Dialog mit EditText für die Eingabe. Wenn ich im Dialogfeld auf die Schaltfläche "Ja" klicke, wird die Eingabe bestätigt und das Dialogfeld anschließend geschlossen. Wenn die Eingabe jedoch falsch ist, möchte ich in demselben Dialogfeld bleiben. Unabhängig von der Art der Eingabe soll das Dialogfeld automatisch geschlossen werden, wenn ich auf die Schaltfläche "Nein" klicke. Wie kann ich dies deaktivieren? Übrigens habe ich PositiveButton und NegativeButton für die Schaltfläche im Dialog verwendet.

1017voto

Tom Bollwitt Punkte 10619

EDITAR: Wie in einigen Kommentaren erwähnt, funktioniert dies nur unter API 8+.

Dies ist eine späte Antwort, aber Sie können einen onShowListener zum AlertDialog hinzufügen, wo Sie dann den onClickListener der Schaltfläche überschreiben können.

final AlertDialog dialog = new AlertDialog.Builder(context)
        .setView(v)
        .setTitle(R.string.my_title)
        .setPositiveButton(android.R.string.ok, null) //Set to null. We override the onclick
        .setNegativeButton(android.R.string.cancel, null)
        .create();

dialog.setOnShowListener(new DialogInterface.OnShowListener() {

    @Override
    public void onShow(DialogInterface dialogInterface) {

        Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // TODO Do something

                //Dismiss once everything is OK.
                dialog.dismiss();
            }
        });
    }
});
dialog.show();

8 Stimmen

Hey, besser spät als nie, genau das habe ich gesucht, danke, +1 :) Dies ist ein eleganter Weg, um die Validierung zu Ihrem Dialog hinzuzufügen, vor allem, wenn Sie bereits eine Hilfsklasse haben, die mit Warnungen umgeht

12 Stimmen

Funktioniert nicht. AlertDialog.Builder.setOnShowListener existiert nicht. developer.Android.com/reference/Android/app/

5 Stimmen

Mit API vor 8 können Sie d.getButton(AlertDialog.BUTTON_POSITIVE); aufrufen, da es sich um eine öffentliche Methode handelt, aber Sie müssen es show(); wurde ausgegeben, andernfalls zou nur null von ihm erhalten

731voto

Sogger Punkte 15426

Hier sind einige Lösungen für alle Arten von Dialogen, einschließlich einer Lösung für AlertDialog.Builder, die auf allen API-Ebenen funktioniert (funktioniert unter API 8, was die andere Antwort hier nicht tut). Es gibt Lösungen für AlertDialogs mit AlertDialog.Builder, DialogFragment, und DialogPreference.

Nachfolgend finden Sie Code-Beispiele, die zeigen, wie Sie den Standard-Button-Handler überschreiben und das Schließen des Dialogs für diese verschiedenen Formen von Dialogen verhindern können. Alle Beispiele zeigen, wie man verhindert, dass die positive Schaltfläche den Dialog schließt.

Hinweis: Eine Beschreibung, wie das Schließen des Dialogs unter der Haube für die Android-Basisklassen funktioniert und warum die folgenden Ansätze gewählt wurden, folgt nach den Beispielen, für diejenigen, die mehr Details wünschen


AlertDialog.Builder - Ändern Sie den Standard-Button-Handler sofort nach show()

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage("Test for preventing dialog close");
builder.setPositiveButton("Test", 
        new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                //Do nothing here because we override this button later to change the close behaviour. 
                //However, we still need this because on older versions of Android unless we 
                //pass a handler the button doesn't get instantiated
            }
        });
final AlertDialog dialog = builder.create();
dialog.show();
//Overriding the handler immediately after show is probably a better approach than OnShowListener as described below
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener()
      {            
          @Override
          public void onClick(View v)
          {
              Boolean wantToCloseDialog = false;
              //Do stuff, possibly set wantToCloseDialog to true then...
              if(wantToCloseDialog)
                  dialog.dismiss();
              //else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false.
          }
      });

DialogFragment - Überschreibung onResume()

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setMessage("Test for preventing dialog close");
    builder.setPositiveButton("Test", 
        new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                //Do nothing here because we override this button later to change the close behaviour. 
                //However, we still need this because on older versions of Android unless we 
                //pass a handler the button doesn't get instantiated
            }
        });
    return builder.create();
}

//onStart() is where dialog.show() is actually called on 
//the underlying dialog, so we have to do it there or 
//later in the lifecycle.
//Doing it in onResume() makes sure that even if there is a config change 
//environment that skips onStart then the dialog will still be functioning
//properly after a rotation.
@Override
public void onResume()
{
    super.onResume();    
    final AlertDialog d = (AlertDialog)getDialog();
    if(d != null)
    {
        Button positiveButton = (Button) d.getButton(Dialog.BUTTON_POSITIVE);
        positiveButton.setOnClickListener(new View.OnClickListener()
                {
                    @Override
                    public void onClick(View v)
                    {
                        Boolean wantToCloseDialog = false;
                        //Do stuff, possibly set wantToCloseDialog to true then...
                        if(wantToCloseDialog)
                            d.dismiss();
                        //else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false.
                    }
                });
    }
}

DialogPreference - Überschreibung showDialog()

@Override
protected void onPrepareDialogBuilder(Builder builder)
{
    super.onPrepareDialogBuilder(builder);
    builder.setPositiveButton("Test", this);   //Set the button here so it gets created
}

@Override
protected void showDialog(Bundle state)
{       
    super.showDialog(state);    //Call show on default first so we can override the handlers

    final AlertDialog d = (AlertDialog) getDialog();
    d.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener()
            {            
                @Override
                public void onClick(View v)
                {
                    Boolean wantToCloseDialog = false;
                    //Do stuff, possibly set wantToCloseDialog to true then...
                    if(wantToCloseDialog)
                        d.dismiss();
                    //else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false.
                }
            });
}

Erläuterung der Ansätze:

Wenn man sich den Android-Quellcode ansieht, funktioniert die AlertDialog-Standardimplementierung, indem ein gemeinsamer Button-Handler für alle aktuellen Buttons in OnCreate() registriert wird. Wenn eine Schaltfläche angeklickt wird, leitet der gemeinsame Button-Handler das Klick-Ereignis an den Handler weiter, den Sie in setButton() übergeben haben, und beendet dann den Dialog.

Wenn Sie verhindern möchten, dass ein Dialogfeld geschlossen wird, wenn eine dieser Schaltflächen gedrückt wird, müssen Sie den allgemeinen Schaltflächen-Handler für die aktuelle Ansicht der Schaltfläche ersetzen. Da er in OnCreate() zugewiesen wird, müssen Sie ihn ersetzen, nachdem die Standardimplementierung von OnCreate() aufgerufen wurde. OnCreate wird während des Prozesses der show()-Methode aufgerufen. Sie könnten eine benutzerdefinierte Dialogklasse erstellen und OnCreate() überschreiben, um super.OnCreate() aufzurufen und dann die Schaltflächenhandler zu überschreiben, aber wenn Sie einen benutzerdefinierten Dialog erstellen, erhalten Sie den Builder nicht kostenlos, was ist dann der Sinn?

Um ein Dialogfeld so zu verwenden, wie es entworfen wurde, aber mit der Kontrolle, wann es beendet wird, besteht ein Ansatz darin, zuerst dialog.Show() aufzurufen und dann einen Verweis auf die Schaltfläche mit dialog.getButton() zu erhalten, um den Click-Handler zu überschreiben. Ein anderer Ansatz besteht darin, setOnShowListener() zu verwenden und das Auffinden der Schaltflächenansicht und das Ersetzen des Handlers im OnShowListener zu implementieren. Der funktionale Unterschied zwischen den beiden ist "fast" gleich, je nachdem, welcher Thread die Dialoginstanz ursprünglich erstellt. Wenn man sich den Quellcode ansieht, wird der OnShowListener durch eine Nachricht aufgerufen, die an einen Handler gesendet wird, der in dem Thread läuft, der den Dialog erstellt hat. Da Ihr OnShowListener also durch eine Nachricht in der Nachrichtenwarteschlange aufgerufen wird, ist es technisch möglich, dass der Aufruf Ihres Listeners einige Zeit nach Beendigung der Show verzögert wird.

Daher glaube ich, dass der sicherste Ansatz der erste ist: show.Dialog() aufzurufen und dann sofort im gleichen Ausführungspfad die Button-Handler zu ersetzen. Da Ihr Code, der show() aufruft, auf dem Haupt-GUI-Thread ausgeführt wird, bedeutet dies, dass der Code, der auf show() folgt, vor jedem anderen Code auf diesem Thread ausgeführt wird, während das Timing der OnShowListener-Methode von der Nachrichtenwarteschlange abhängt.

16 Stimmen

Dies ist bei weitem die einfachste Implementierung und funktioniert perfekt. Ich habe verwendet AlertDialog.Builder - Ändern Sie den Standard-Button-Handler sofort nach show() und es funktioniert wie ein Zauber.

1 Stimmen

@sogger dude, ich total fett bearbeitet Ihre erstaunliche Antwort, weil in Abschnitt 1 Sie dismiss(); statt ich glaube, dialog.dismiss(); vielen Dank für die awesome Antwort!

0 Stimmen

Gibt es eine Möglichkeit, das Schließen einer ProgressDialog wenn auf eine Schaltfläche geklickt wird?

66voto

Suragch Punkte 420096

Eine alternative Lösung

Ich möchte eine alternative Antwort aus der UX-Perspektive geben.

Warum sollten Sie verhindern wollen, dass ein Dialogfeld geschlossen wird, wenn eine Schaltfläche angeklickt wird? Vermutlich, weil Sie ein benutzerdefiniertes Dialogfeld haben, in dem der Benutzer noch keine Auswahl getroffen oder noch nicht alles vollständig ausgefüllt hat. Und wenn der Benutzer noch nicht fertig ist, sollten Sie ihm nicht erlauben, auf die positive Schaltfläche zu klicken. Deaktivieren Sie sie einfach, bis alles fertig ist.

In den anderen Antworten hier werden viele Tricks genannt, wie man den positiven Tastenklick außer Kraft setzen kann. Wenn das wichtig wäre, hätte Android dann nicht eine praktische Methode dafür entwickelt? Das haben sie nicht.

Stattdessen wird die Leitfaden zur Gestaltung von Dialogen zeigt ein Beispiel für eine solche Situation. Die Schaltfläche "OK" ist deaktiviert, bis der Benutzer eine Auswahl getroffen hat. Es sind überhaupt keine Überbrückungstricks notwendig. Es ist für den Benutzer offensichtlich, dass noch etwas zu tun ist, bevor er fortfahren kann.

enter image description here

So deaktivieren Sie die Positiv-Taste

Siehe die Android-Dokumentation zur Erstellung eines benutzerdefinierten Dialoglayouts . Sie empfiehlt, dass Sie Ihre AlertDialog innerhalb einer DialogFragment . Dann müssen Sie nur noch Listener für die Layout-Elemente festlegen, um zu wissen, wann die positive Schaltfläche aktiviert oder deaktiviert werden soll.

Die positive Taste kann wie folgt deaktiviert werden:

AlertDialog dialog = (AlertDialog) getDialog();
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);

Hier ist eine komplette Arbeitsgruppe DialogFragment mit einer deaktivierten positiven Schaltfläche, wie sie in der obigen Abbildung verwendet werden könnte.

import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;

public class MyDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        // inflate the custom dialog layout
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.my_dialog_layout, null);

        // add a listener to the radio buttons
        RadioGroup radioGroup = (RadioGroup) view.findViewById(R.id.radio_group);
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                // enable the positive button after a choice has been made
                AlertDialog dialog = (AlertDialog) getDialog();
                dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
            }
        });

        // build the alert dialog
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setView(view)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        // TODO: use an interface to pass the user choice back to the activity
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        MyDialogFragment.this.getDialog().cancel();
                    }
                });
        return builder.create();
    }

    @Override
    public void onResume() {
        super.onResume();

        // disable positive button by default
        AlertDialog dialog = (AlertDialog) getDialog();
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
    }
}

Das benutzerdefinierte Dialogfeld kann über eine Aktivität wie diese ausgeführt werden:

MyDialogFragment dialog = new MyDialogFragment();
dialog.show(getFragmentManager(), "MyTag");

Anmerkungen

  • Der Kürze halber habe ich die Kommunikationsschnittstelle weggelassen, über die die Informationen zur Benutzerwahl an die Aktivität zurückgegeben werden. Die Dokumentation zeigt jedoch, wie dies geschieht.
  • Die Taste ist immer noch null en onCreateDialog daher habe ich sie in onResume . Dies hat den unerwünschten Effekt, dass es wieder deaktiviert wird, wenn der Benutzer zu einer anderen Anwendung wechselt und dann zurückkommt, ohne den Dialog zu schließen. Dies könnte dadurch gelöst werden, dass auch die Auswahlmöglichkeiten des Benutzers abgewählt werden oder ein Runnable de onCreateDialog um die Schaltfläche bei der nächsten Durchlaufschleife zu deaktivieren.

    view.post(new Runnable() {
        @Override
        public void run() {
            AlertDialog dialog = (AlertDialog) getDialog();
            dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
        }
    });

Verwandte Seiten

1 Stimmen

Für sehr einfache Dialoge ist das in Ordnung, aber wenn die Eingabeüberprüfung komplexer ist als die hier gezeigte oder wenn sie mehrere Felder enthält, brauchen Sie eine Möglichkeit, dem Benutzer mitzuteilen, WARUM er nicht fortfahren kann.

0 Stimmen

@mhsmith, stimmt, aber für etwas Komplexes mit mehreren Feldern würde ich wahrscheinlich keinen Popup-Dialog verwenden.

37voto

YuviDroid Punkte 1536

Ich habe eine einfache Klasse (einen AlertDialogBuilder) geschrieben, mit der Sie die automatische Entlassung beim Drücken der Schaltflächen des Dialogs deaktivieren können.

Es ist auch mit Android 1.6 kompatibel, macht also keinen Gebrauch vom OnShowListener (der nur in API >= 8 verfügbar ist).

Anstelle von AlertDialog.Builder können Sie also diesen CustomAlertDialogBuilder verwenden. Das Wichtigste dabei ist, dass Sie nicht erstellen() sondern nur die zeigen() Methode. Ich habe Methoden hinzugefügt wie setCancledOnTouchOutside() y setOnDismissListener so dass Sie sie immer noch direkt im Builder einstellen können.

Ich habe es auf Android 1.6, 2.x, 3.x und 4.x getestet, also sollte es ziemlich gut funktionieren. Wenn Sie einige Probleme finden, kommentieren Sie bitte hier.

package com.droidahead.lib.utils;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.View;
import android.view.View.OnClickListener;

public class CustomAlertDialogBuilder extends AlertDialog.Builder {
    /**
     * Click listeners
     */
    private DialogInterface.OnClickListener mPositiveButtonListener = null;
    private DialogInterface.OnClickListener mNegativeButtonListener = null;
    private DialogInterface.OnClickListener mNeutralButtonListener = null;

    /**
     * Buttons text
     */
    private CharSequence mPositiveButtonText = null;
    private CharSequence mNegativeButtonText = null;
    private CharSequence mNeutralButtonText = null;

    private DialogInterface.OnDismissListener mOnDismissListener = null;

    private Boolean mCancelOnTouchOutside = null;

    public CustomAlertDialogBuilder(Context context) {
        super(context);
    }

    public CustomAlertDialogBuilder setOnDismissListener (DialogInterface.OnDismissListener listener) {
        mOnDismissListener = listener;
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setNegativeButton(CharSequence text, DialogInterface.OnClickListener listener) {
        mNegativeButtonListener = listener;
        mNegativeButtonText = text;
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setNeutralButton(CharSequence text, DialogInterface.OnClickListener listener) {
        mNeutralButtonListener = listener;
        mNeutralButtonText = text;
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener) {
        mPositiveButtonListener = listener;
        mPositiveButtonText = text;
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setNegativeButton(int textId, DialogInterface.OnClickListener listener) {
        setNegativeButton(getContext().getString(textId), listener);
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setNeutralButton(int textId, DialogInterface.OnClickListener listener) {
        setNeutralButton(getContext().getString(textId), listener);
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setPositiveButton(int textId, DialogInterface.OnClickListener listener) {
        setPositiveButton(getContext().getString(textId), listener);
        return this;
    }

    public CustomAlertDialogBuilder setCanceledOnTouchOutside (boolean cancelOnTouchOutside) {
        mCancelOnTouchOutside = cancelOnTouchOutside;
        return this;
    }

    @Override
    public AlertDialog create() {
        throw new UnsupportedOperationException("CustomAlertDialogBuilder.create(): use show() instead..");
    }

    @Override
    public AlertDialog show() {
        final AlertDialog alertDialog = super.create();

        DialogInterface.OnClickListener emptyOnClickListener = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) { }
        };

        // Enable buttons (needed for Android 1.6) - otherwise later getButton() returns null
        if (mPositiveButtonText != null) {
            alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, mPositiveButtonText, emptyOnClickListener);
        }

        if (mNegativeButtonText != null) {
            alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, mNegativeButtonText, emptyOnClickListener);
        }

        if (mNeutralButtonText != null) {
            alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, mNeutralButtonText, emptyOnClickListener);
        }

        // Set OnDismissListener if available
        if (mOnDismissListener != null) {
            alertDialog.setOnDismissListener(mOnDismissListener);
        }

        if (mCancelOnTouchOutside != null) {
            alertDialog.setCanceledOnTouchOutside(mCancelOnTouchOutside);
        }

        alertDialog.show();

        // Set the OnClickListener directly on the Button object, avoiding the auto-dismiss feature
        // IMPORTANT: this must be after alert.show(), otherwise the button doesn't exist..
        // If the listeners are null don't do anything so that they will still dismiss the dialog when clicked
        if (mPositiveButtonListener != null) {
            alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    mPositiveButtonListener.onClick(alertDialog, AlertDialog.BUTTON_POSITIVE);
                }
            });
        }

        if (mNegativeButtonListener != null) {
            alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    mNegativeButtonListener.onClick(alertDialog, AlertDialog.BUTTON_NEGATIVE);
                }
            });
        }

        if (mNeutralButtonListener != null) {
            alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    mNeutralButtonListener.onClick(alertDialog, AlertDialog.BUTTON_NEUTRAL);
                }
            });
        }

        return alertDialog;
    }   
}

EDIT Hier ist ein kleines Beispiel für die Verwendung des CustomAlertDialogBuilder:

// Create the CustomAlertDialogBuilder
CustomAlertDialogBuilder dialogBuilder = new CustomAlertDialogBuilder(context);

// Set the usual data, as you would do with AlertDialog.Builder
dialogBuilder.setIcon(R.drawable.icon);
dialogBuilder.setTitle("Dialog title");
dialogBuilder.setMessage("Some text..");

// Set your buttons OnClickListeners
dialogBuilder.setPositiveButton ("Button 1", new DialogInterface.OnClickListener() {
    public void onClick (DialogInterface dialog, int which) {
        // Do something...

        // Dialog will not dismiss when the button is clicked
        // call dialog.dismiss() to actually dismiss it.
    }
});

// By passing null as the OnClickListener the dialog will dismiss when the button is clicked.               
dialogBuilder.setNegativeButton ("Close", null);

// Set the OnDismissListener (if you need it)       
dialogBuilder.setOnDismissListener(new DialogInterface.OnDismissListener() {
    public void onDismiss(DialogInterface dialog) {
        // dialog was just dismissed..
    }
});

// (optional) set whether to dismiss dialog when touching outside
dialogBuilder.setCanceledOnTouchOutside(false);

// Show the dialog
dialogBuilder.show();

Zum Wohl,

Yuvi

0 Stimmen

Schön. Hat bei mir aber nicht funktioniert. Der Dialog wird trotzdem abgetan.

0 Stimmen

Hmm, das klingt seltsam. Ich verwende das in meiner App und nur Schaltflächen, bei denen ich explizit dialog.dismiss() aufrufe, schließen den Dialog. Mit welcher Android-Version testen Sie? Können Sie Ihren Code zeigen, wo Sie die CustomAlertDialogBuilder verwendet?

0 Stimmen

Ich denke, es ist wegen dieser verursacht: (Aufruf dialog.show() nach onClickListener) pastebin.com/uLnSu5v7 Wenn ich positiveButton klicken sie entlassen werden, wenn boolesche wahr ist...

32voto

Zhuiguang Liu Punkte 491

Hier ist etwas, wenn Sie Folgendes verwenden DialogFragment - was ohnehin der empfohlene Weg ist, um Dialoge zu behandeln.

Was passiert mit AlertDialog's setButton() Methode (und ich nehme an, das gilt auch für AlertDialogBuilder 's setPositiveButton() y setNegativeButton() ) ist, dass die von Ihnen festgelegte Schaltfläche (z. B. AlertDialog.BUTTON_POSITIVE ) damit werden tatsächlich ZWEI verschiedene OnClickListener Objekte, wenn sie gedrückt werden.

Die erste ist DialogInterface.OnClickListener der ein Parameter für setButton() , setPositiveButton() y setNegativeButton() .

Das andere ist View.OnClickListener die so eingestellt wird, dass sie automatisch Ihre AlertDialog wenn eine seiner Tasten gedrückt wird - und wird durch AlertDialog selbst.

Was Sie tun können, ist die Verwendung von setButton() con null als die DialogInterface.OnClickListener , um die Schaltfläche zu erstellen, und rufen Sie dann Ihre benutzerdefinierte Aktionsmethode innerhalb von View.OnClickListener . Zum Beispiel,

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
    AlertDialog alertDialog = new AlertDialog(getActivity());
    // set more items...
    alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "OK", null);

    return alertDialog;
}

Dann können Sie den Standardwert überschreiben AlertDialog Tasten View.OnClickListener (die sonst den Dialog beenden würde) in der DialogFragment 's onResume() Methode:

@Override
public void onResume()
{
    super.onResume();
    AlertDialog alertDialog = (AlertDialog) getDialog();
    Button okButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
    okButton.setOnClickListener(new View.OnClickListener() { 
        @Override
        public void onClick(View v)
        {
            performOkButtonAction();
        }
    });
}

private void performOkButtonAction() {
    // Do your stuff here
}

Sie müssen diese Einstellung in der Datei onResume() Methode, weil getButton() wird zurückgegeben null bis der Dialog gezeigt wurde!

Dies sollte dazu führen, dass Ihre benutzerdefinierte Aktionsmethode nur einmal aufgerufen wird, und das Dialogfeld wird nicht standardmäßig abgebrochen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X