È possibile preparare un pulsante su un alertDialog che non chiude automaticamente la finestra di dialogo?

StackOverflow https://stackoverflow.com/questions/2597371

  •  25-09-2019
  •  | 
  •  

Domanda

Ho una semplice visualizzazione elenco con alcune caselle di controllo in una finestra di dialogo Avviso. Devo opzione per aggiungere una selezione tutto/nessuno, ma non è possibile visualizzare il menu in una finestra di dialogo Avviso e voglio fare questa funzione da un pulsante. Da quello che ho visto qualsiasi tipo di pulsante (positivo, neutro e negativo) chiude il dialogo indipendentemente.

Quindi, è possibile? Se no, quali alternative ho? La mia ultima mitigazione è semplicemente creare una nuova visione e ricreare tutto. È una nuova vista il migliore soluzione?

È stato utile?

Soluzione

Quindi, è possibile?

Non dai pulsanti standard in AlertDialog, PER QUANTO NE SO.

Se no, quali alternative ho?

Eccotene alcune:

  1. Non offrire selezionare tutto/nessuno
  2. Non usare AlertDialog, ma usa un'attività a tema dialogo
  3. Non usare AlertDialog, ma usa qualche altra sottoclasse di Dialog
  4. La tua opzione citata (non usare setAdapter(), ma piuttosto crea il tuo View Per i contenuti della finestra di dialogo)
  5. Non usare un Dialog per niente, ma a ListActivity Iniziato via startActivityForResult() (simile al n. 2, solo senza preoccuparsi del tema)

Altri suggerimenti

Devi sopravvivere al pulsante OnClicklistener. Ad esempio per il pulsante neutro, avrai qualcosa del genere:

AlertDialog dialog = builder.create();
dialog.setButton(AlertDialog.BUTTON_NEUTRAL, "Neutral", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    } 
});
dialog.setButton(AlertDialog.BUTTON_POSITIVE, "Positive", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
    } 
});
dialog.show();

Button neutralButton = dialog.getButton(DialogInterface.BUTTON_NEUTRAL);
neutralButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View onClick) {                 
        /**
        *
        * your code
        * 
        */

    }
});

Quindi, è possibile?

Puoi provare a utilizzare il seguente metodo per posizionare la tua vista personalizzata su AlertDialog:

android.app.AlertDialog.Builder.setView(View view)

Quella vista può contenere il pulsante. Basta allegare un OnClickListener al pulsante che funzionerebbe con la vista dell'elenco.

Hai provato ad estendere la classe AlertDialog e di averla implementata onClickListener

public class MyDialog extends AlertDialog implements OnClickListener {
    private Button myButton;

    public void onCreate( Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );
        // use LayoutInflater to get at custom button
        LayoutInflater layoutInflater = (LayoutInflater)getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        View contentView = layoutInflater.inflate( R.layout.mydialog_layout, null );

        // pull button from layout, set listener
        myButton = (Button)contentView.findViewById( R.id.myButtonId );
        myButton.setOnClickListener( this );

        setContentView( contentView );
    }

    public void onClick( View v ) {
        if ( v.getId() == R.id.myButtonId ) {
            // DO your button actions.
        }
    }
}

Seguendo questo modello, è possibile inserire tutti i pulsanti di cui hai bisogno e creare la propria funzionalità all'interno della finestra di dialogo stesso. Potresti anche creare il tuo pulsante in fase di esecuzione, ma dovrai fare il lavoro extra per la configurazione del testo, delle dimensioni, dell'icona, ecc.

È quindi possibile creare la finestra di dialogo nella tua attività sotto la chiamata OnCreatediaLog ().

protected Dialog onCreateDialog( int id ) {
    MyDialog dialog = new MyDialog( this, 0 );
    dialog.setOnCancelListener( this );
    dialog.setOnDismissListener( this );
    return dialog;
}

Spero che sia di aiuto.

È possibile. La soluzione è

  1. Sovrascrivere il dismiss metodo a fare niente. Ciò impedirà di licenziare la finestra di dialogo quando si fa clic sul pulsante. Facoltativamente, puoi anche Salva il licenziamento originale.

  2. Modifica il tuo OnClickListener in modo che chiami il superclasse del tuo dialogo (cioè AlertDialog) SULLY () (vale a dire super.dismiss()) Quando i pulsanti desideri sono (sono) cliccati.

Di solito faccio la classe di dialogo l'ascoltatore, quindi farò qualcosa del genere

public class MyAlertDialog extends AlertDialog implements OnClickListener {

    // other methods
    @Override
    public void dismiss() {

    }

    // superclass's dismiss, might come in handy when the OnClickListener is not this dialog
    public void normalDismiss() {
        super.dismiss();
    }

    public void onClick(DialogInterface dialog, int which) {
        switch (which) {
        case BUTTON_NEGATIVE:
            // handle your event
            super.dismiss();
            break;
        case BUTTON_NEUTRAL:
            // handle your event
            break;
        case BUTTON_POSITIVE:
        default:
            // handle your event
            super.dismiss();
            break;
        }
    }

}

in modo che si licenzia la finestra di dialogo solo quando si fa clic sul pulsante negativo o positivo, ma mantieni la finestra di dialogo in mostra quando il pulsante è neutro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top