Come mantenere un alertdialog aperto dopo onclick del pulsante è licenziato?

Il soggetto un pò dice tutto.. io sono la richiesta di un codice PIN da parte dell’utente, se le inserisci, fare clic su OK Positiva Pulsante e il PIN non è corretto che si desidera visualizzare un Toast, ma tenere aperta la finestra di dialogo. Al momento si chiude automaticamente.. Sicuro che questo è molto banale cosa corretta ma non riesco a trovare la risposta ancora.

Grazie..

  • Attualmente sto solo ricordando che la funzione di creare e visualizzare una finestra di dialogo, ma ci si sente come uno spreco di risorse quando ho solo bisogno di informare la finestra non chiude…
  • duplicato di stackoverflow.com/questions/2620444/…
InformationsquelleAutor Dave | 2010-10-25

 

6 Replies
  1. 12

    Costruire una finestra di dialogo personalizzata con un EditText con l’attributo android:password=”true” pulsante, quindi impostare manualmente onClick ascoltatore il pulsante, e in modo esplicito decidere cosa fare di esso.

    <?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> 

    Poi, quando si desidera 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();  
    • Grazie, quindi, finestre di dialogo, se non si specifica un layout personalizzato si chiude automaticamente in un onclick?
    • Faccio credere che è così, potrei anche essere sbagliato, ma l’ho trovato più facile fare una finestra di dialogo personalizzata, invece di cercare di ottenere un altro uno per lavoro e ho avuto il controllo totale su quello che sembra e come si comporta. Plz segnare la risposta accettata se funziona per voi.
  2. 41

    Non è necessario creare una classe personalizzata. È possibile registrare una Vista.OnClickListener per il AlertDialog. Questo listener non chiudere la AlertDialog. Il trucco qui è che è necessario per registrare il listener dopo la finestra di dialogo è stato mostrato, ma può ben essere fatto all’interno di un OnShowListener. È possibile utilizzare un accessorio variabile booleana per verificare se questo è già stato fatto in modo che si sarà fatto solo una volta:

        /*
         * 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;
                }
            }
        });

    Parte di questa soluzione è stata fornita da http://groups.google.com/group/android-developers/browse_thread/thread/fb56c8721b850124#

    • Questa soluzione ha funzionato per me, grazie
    • Purtroppo, setOnShowListener è disponibile solo in API Level 8 e versioni successive. A supportare le API 7, sto seguendo l’approccio dell’nella pagina che hai linkato: passare un no-op ascoltatore setNegativeButton, chiamata show(), quindi ottenere un riferimento al pulsante di chiamata setOnClickListener() con il pieno ascoltatore.
    • +1 per la gentile risposta, Questa soluzione funziona per me.
    • Bel lavoro. Un solo errore nel codice: alertAndHelp dovrebbe essere alert. Inoltre, non è del tutto chiaro per me perché è necessario il alertReady bandiera, è solo per evitare di correre il codice quando lo stesso alertdialog è mostrare di nuovo?
    • Grazie per la segnalazione il nome della variabile errore di out! (Che fissa l’ora). Il alertReady bandiera è lì solo per rendere esplicito che non è necessario eseguire il codice all’interno di un pulsante.setOnClickListener ogni volta la finestra di dialogo viene visualizzata, nel caso in cui qualcuno finisce per fare qualcosa di laborous in là. 🙂
    • Nel mio caso ha funzionato, ma ho dovuto aggiungere una nuova riga di codice: button.setVisibility(View.VISIBLE); Il pulsante non era visibile sul AlertDialog. Grazie per questo suggerimento

  3. 5

    È possibile impostare un OnClickListener come segue per mantenere aperta la finestra di dialogo:

    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();
                    }
                }
            });
        }
    }
  4. 1

    Si può solo continuare a utilizzare la finestra di dialogo è già, basta mettere una clausola nel onClick() dicendo

    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();
    }

    Ora, di utilizzare questo codice, è sufficiente richiamare il testo.setText(“”); e inserire il testo che si desidera qui
    errore comune è che quando si digita in:

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

    si dimentica che deve essere effettivamente

    dialog.findViewById

    e questo a prescindere di quale sia il nome della finestra di dialogo, nel mio esempio accade solo per essere lo stesso nome.

    <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>
    • Questo è quello che stavo facendo, tuttavia, la finestra si chiude automaticamente anche senza chiudere() chiamata.
    • Bene, dopo aver guardato in esso, sembra che la finestra di dialogo personalizzata sta per essere la vostra scommessa migliore.. io modificare la mia risposta a quello che troverete utile. In realtà sto usando nella mia applicazione. non dimenticate di segnare accettata se si utilizza la mia risposta 🙂
  5. 1

    Provare questo:

    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();

    Fonte: Evitare Alertdialog dalla chiusura dopo il clic del pulsante


    Spero Che Questo Aiuta! Buona Fortuna!

  6. 0

    Stesso problema per me in un FragmentDialog. Ecco il mio penale/soluzione elegante:
    Rimuovere tutti i pulsanti nella finestra di dialogo (positivo,negativo,neutro). Aggiungere i pulsanti da xml.es.:

    <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>

    E poi nel codice di maneggiare con:

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

    dove la vista è la vista assegnati per il dialogo!

Lascia un commento