2010-10-25 3 views
25

Das Thema irgendwie sagt alles .. Ich bin eine PIN-Code vom Benutzer anfordern, wenn sie es eingeben, klicken Sie auf die OK-Taste und die PIN ist falsch Ich möchte einen Toast anzeigen, aber den Dialog geöffnet. Im Moment schließt es sich automatisch. Sicher ist das eine sehr triviale Sache zu korrigieren, aber kann die Antwort noch nicht finden.Wie wird ein Alertdialog geöffnet, nachdem die Schaltfläche onclick ausgelöst wurde?

Dank ..

+0

Ich erinnere mich gerade an meine Funktion zum Erstellen und Anzeigen eines Dialogs, aber es fühlt sich an wie eine Verschwendung von Ressourcen, wenn ich nur den Dialog informieren muss, um sich nicht zu entlassen ... – Dave

+2

Duplikat von http://StackOverflow.com/questions/2620444/how-to-verhindern-a-dialog-from-closing-wenn-eine-taste-ist-geklickt/9523257 – ccpizza

Antwort

12

mit einem EditText mit dem Attribut android ein benutzerdefiniertes Dialog Körperbau: password = „true“ eine Taste, und stellen Sie manuell Hörer onClick die Schaltfläche und explizit wählen, was in ihm zu tun.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <EditText 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:minWidth="180dip" 
     android:digits="1234567890" 
     android:maxLength="4" 
     android:password="true"/> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <Button 
      android:id="@+id/Accept" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Accept"/> 

    </LinearLayout> 
</LinearLayout> 

Dann, wenn Sie es möchten Pop-up:

final Dialog dialog = new Dialog(RealizarPago.this); 
dialog.setContentView(R.layout.custom_dialog); 
dialog.setTitle("PIN number:"); 
dialog.setCancelable(true); 

Button button = (Button) dialog.findViewById(R.id.Accept); 
button.setOnClickListener(new OnClickListener() { 
@Override 
    public void onClick(View v) { 
     if(password_wrong){ 
      // showToast 
     } else{ 
      dialog.dismiss(); 
      // other stuff to do 
     } 
    } 
}); 

dialog.show(); 
+0

Danke, so Dialoge, wenn Sie ein benutzerdefiniertes Layout angeben, wird automatisch in einem onclick geschlossen? – Dave

+0

Ich glaube also, ich könnte mich irren, aber ich fand es einfacher, einen benutzerdefinierten Dialog zu tun, statt zu versuchen, einen anderen zu arbeiten, und ich hatte die totale Kontrolle darüber, wie es aussieht und wie es sich verhält. Plz markieren Sie die Antwort als akzeptiert, wenn es für Sie funktioniert. – blindstuff

1

Sie können einfach weiter den Dialog mit Ihnen bereits haben, nur eine if-Klausel setzen in der onClick() sagen

if(pin_check_method){ //pin_check_method should be a boolean returned method 
    //close the Dialog, then continue 
    } 
    else{ 
    //dont put the dialog.dismiss() in here, put instead 
    Toast.makeText(getApplicationContext(),"Invalid pin, please try again",Toast.LENGTH_LONG).show(); 
} 

Jetzt, um diesen Code zu verwenden, rufen Sie einfach text.setText (""); und setzen im Text wollen Sie hier häufiger Fehler ist, dass bei der Eingabe in:

TextView text = (TextView) findViewById(R.id.dialog); 

Sie vermissen, dass es tatsächlich

dialog.findViewById 

und dies ist unabhängig davon, was der Name der muss sein Dialog ist, in meinem Beispiel ist es einfach der gleiche Name.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/layout_root" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       > 

    <TextView android:id="@+id/text" 
       android:layout_height="wrap_content" 
       android:textColor="#FFF" 
       android:layout_centerHorizontal="true" 
       android:layout_width="wrap_content"/> 



    <Button android:text="Continue" 
      android:id="@+id/Button01" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" android:layout_below="@+id/text"> 
      </Button> 

</RelativeLayout> 
+0

Dies ist, was ich tat, aber der Dialog wird automatisch geschlossen, auch ohne den Aufruf von ablsen(). – Dave

+0

Okay, nachdem ich es angeschaut habe, sieht es so aus, als ob ein benutzerdefinierter Dialog die beste Wahl ist. Ich bearbeite meine Antwort auf eine, die Sie nützlich finden. Ich benutze es tatsächlich in meiner Anwendung. vergiss nicht, als akzeptiert zu markieren, wenn du meine Antwort verwendest :) – Samuel

4

Sie können einen OnClickListener gesetzt, wie den Dialog offen zu halten folgt:

public class MyDialog extends AlertDialog { 
    public MyDialog(Context context) { 
     super(context); 
     setMessage("Hello"); 
     setButton(AlertDialog.BUTTON_POSITIVE, "Ok", (new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       // this will never be called 
      } 
     }); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (ok) { 
        // do something 
        dismiss(); 
       } else { 
        Toast.makeText(getContext(), "when you see this message, the dialog should stay open", Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 
    } 
} 
36

Sie benötigen keine eigene Klasse zu erstellen. Sie können einen View.OnClickListener für den AlertDialog registrieren. Dieser Listener wird den AlertDialog nicht verwerfen. Der Trick hier ist, dass Sie den Listener registrieren müssen, nachdem der Dialog angezeigt wurde, aber es kann sauber innerhalb eines OnShowListener getan werden. Sie können ein Zubehör boolean Variable überprüfen, ob diese bereits getan wurde, so dass es nur einmal durchgeführt werden:

/* 
    * Prepare the alert with a Builder. 
    */ 
    AlertDialog.Builder b = new AlertDialog.Builder(this); 

    b.setNegativeButton("Button", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) {} 
    }); 
    this.alert = b.create(); 

    /* 
    * Add an OnShowListener to change the OnClickListener on the 
    * first time the alert is shown. Calling getButton() before 
    * the alert is shown will return null. Then use a regular 
    * View.OnClickListener for the button, which will not 
    * dismiss the AlertDialog after it has been called. 
    */ 

    this.alertReady = false; 
    alert.setOnShowListener(new DialogInterface.OnShowListener() { 
     @Override 
     public void onShow(DialogInterface dialog) { 
      if (alertReady == false) { 
       Button button = alert.getButton(DialogInterface.BUTTON_NEGATIVE); 
       button.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         //do something 
        } 
       }); 
       alertReady = true; 
      } 
     } 
    }); 

Ein Teil dieser Lösung durch http://groups.google.com/group/android-developers/browse_thread/thread/fb56c8721b850124#

+0

Diese Lösung hat bei mir funktioniert, danke –

+1

Leider ist setOnShowListener nur in API Level 8 und höher verfügbar. Zur Unterstützung von API 7 befolge ich die Vorgehensweise auf der Seite, mit der Sie verlinkt haben: Übergeben Sie einen No-Op-Listener an setNegativeButton, rufen Sie show() auf, rufen Sie dann einen Verweis auf die Schaltfläche ab und rufen setOnClickListener() mit dem vollständigen Listener auf. – Travis

+0

+1 für nette und hilfreiche Antwort, diese Lösung funktioniert für mich. – rajpara

0

gleiche Problem für mich in einem FragmentDialog bereitgestellt wurde . Hier ist meine kriminelle/elegante Lösung: Entfernen Sie alle Schaltflächen aus dem Dialog (positiv, negativ, neutral). Fügen Sie Ihre Schaltflächen aus der xml.eg .:

<LinearLayout 
     android:layout_width="match_parent" 
     android:orientation="horizontal" 
     android:layout_height="wrap_content"> 
     <Button 
      android:layout_width="0dp" 
      android:layout_weight="1" 
      android:layout_height="wrap_content" 
      android:id="@+id/button_cancel" 
      style="@style/Widget.AppCompat.Button.Borderless.Colored" 
      android:text="@android:string/cancel" 
      android:layout_gravity="left" 
      /> 
     <Button 
      android:layout_width="0dp" 
      android:layout_weight="1" 
      android:layout_height="wrap_content" 
      android:id="@+id/button_ok" 
      style="@style/Widget.AppCompat.Button.Borderless.Colored" 
      android:text="@android:string/ok" 
      android:layout_gravity="right" 
      /> 
    </LinearLayout> 

Und dann in Ihrem Code handle es mit:

view.findViewById(R.id.button_ok).setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view2) { 
        if (wannaClose) 
         dismiss(); 
        else 
         //do stuff without closing! 
       } 
      }); 

wo Ansicht der Blick auf den Dialog zugeordnet ist!

0

Versuchen Sie folgendes:

final AlertDialog alertDialog = 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(); 

alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { 

    @Override 
    public void onShow(DialogInterface dialog) { 

     Button b = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); 
     b.setOnClickListener(new View.OnClickListener() { 

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

      } 
     }); 
    } 
}); 
alertDialog.show(); 

Quelle: Prevent Alertdialog from closing after button click


hoffe, das hilft! Viel Glück!

Verwandte Themen