È possibile preparare un pulsante su un alertDialog che non chiude automaticamente la finestra di dialogo?
-
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?
Soluzione
Quindi, è possibile?
Non dai pulsanti standard in AlertDialog
, PER QUANTO NE SO.
Se no, quali alternative ho?
Eccotene alcune:
- Non offrire selezionare tutto/nessuno
- Non usare
AlertDialog
, ma usa un'attività a tema dialogo - Non usare
AlertDialog
, ma usa qualche altra sottoclasse diDialog
- La tua opzione citata (non usare
setAdapter()
, ma piuttosto crea il tuoView
Per i contenuti della finestra di dialogo) - Non usare un
Dialog
per niente, ma aListActivity
Iniziato viastartActivityForResult()
(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 è
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.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.