Lorsqu'un utilisateur clique sur un Bouton
dans mon application (qui est affichée dans un SurfaceView
), j'aimerais qu'une boîte de dialogue texte Dialog
apparaisse et j'aimerais stocker le résultat dans une String
. Je voudrais que la boîte de dialogue texte Dialog
se superpose à l'écran actuel. Comment puis-je faire cela ?
Réponses
Trop de publicités?J'ai trouvé qu'il était plus propre et plus réutilisable d'étendre AlertDialog.Builder
pour créer une classe de dialogue personnalisée. Cela concerne un dialogue qui demande à l'utilisateur d'entrer un numéro de téléphone. Un numéro de téléphone prédéfini peut également être fourni en appelant setNumber()
avant d'appeler show()
.
InputSenderDialog.java
public class InputSenderDialog extends AlertDialog.Builder {
public interface InputSenderDialogListener{
public abstract void onOK(String number);
public abstract void onCancel(String number);
}
private EditText mNumberEdit;
public InputSenderDialog(Activity activity, final InputSenderDialogListener listener) {
super( new ContextThemeWrapper(activity, R.style.AppTheme) );
@SuppressLint("InflateParams") // Il semble que l'utilisation de NULL dans un AlertDialog soit OK...
View dialogLayout = LayoutInflater.from(activity).inflate(R.layout.dialog_input_sender_number, null);
setView(dialogLayout);
mNumberEdit = dialogLayout.findViewById(R.id.numberEdit);
setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
if( listener != null )
listener.onOK(String.valueOf(mNumberEdit.getText()));
}
});
setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
if( listener != null )
listener.onCancel(String.valueOf(mNumberEdit.getText()));
}
});
}
public InputSenderDialog setNumber(String number){
mNumberEdit.setText( number );
return this;
}
@Override
public AlertDialog show() {
AlertDialog dialog = super.show();
Window window = dialog.getWindow();
if( window != null )
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
return dialog;
}
}
dialog_input_sender_number.xml
Usage:
new InputSenderDialog(getActivity(), new InputSenderDialog.InputSenderDialogListener() {
@Override
public void onOK(final String number) {
Log.d(TAG, "L'utilisateur a appuyé sur OK, le numéro est "+number);
}
@Override
public void onCancel(String number) {
Log.d(TAG, "L'utilisateur a appuyé sur Annuler, le numéro est "+number);
}
}).setNumber(someNumberVariable).show();
@LukeTaylor: J'ai actuellement la même tâche entre les mains (créer une fenêtre contextuelle/dialogue qui contient un EditText)..
Personnellement, je trouve que la méthode entièrement dynamique est quelque peu limitée en termes de créativité.
MISE EN PAGE DE DIALOGUE COMPLÈTEMENT PERSONNALISÉE :
Au lieu de compter entièrement sur du Code pour créer le Dialogue, vous pouvez le personnaliser entièrement comme ceci :
1) - Créez un nouveau fichier de Resource Layout
.. Cela servira de votre Dialogue, permettant une totale liberté créative!
NOTE : Référez-vous aux directives de Material Design pour vous aider à maintenir les choses propres et ciblées.
2) - Donnez des ID à tous vos éléments View
.. Dans mon exemple de code ci-dessous, j'ai 1 EditText
, et 2 Boutons
.
3) - Créez une Activity
avec un Bouton
, à des fins de test.. Nous allons le gonfler et lancer votre Dialogue!
public void buttonClick_DialogTest(View view) {
AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this);
// Gonflez le fichier de ressources de mise en page que vous avez créé à l'étape 1
View mView = getLayoutInflater().inflate(R.layout.timer_dialog_layout, null);
// Obtenez les éléments de Vue du fichier de mise en page. Assurez-vous d'inclure le nom de la vue gonflée (mView)
final EditText mTimerMinutes = (EditText) mView.findViewById(R.id.etTimerValue);
Button mTimerOk = (Button) mView.findViewById(R.id.btnTimerOk);
Button mTimerCancel = (Button) mView.findViewById(R.id.btnTimerCancel);
// Créez l'AlertDialog en utilisant tout ce dont nous avions besoin ci-dessus
mBuilder.setView(mView);
final AlertDialog timerDialog = mBuilder.create();
// Définissez un écouteur pour le Bouton OK
mTimerOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick (View view) {
if (!mTimerMinutes.getText().toString().isEmpty()) {
Toast.makeText(MainActivity.this, "Vous avez entré une valeur !", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "Veuillez entrer une valeur !", Toast.LENGTH_LONG).show();
}
}
});
// Définissez un écouteur pour le Bouton ANNULER
mTimerCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick (View view) {
timerDialog.dismiss();
}
});
// Enfin, AFFICHEZ votre Dialogue !
timerDialog.show();
// FIN DE buttonClick_DialogTest
}
Un jeu d'enfant ! Une totale liberté créative ! Assurez-vous simplement de suivre les Directives Material ;)
J'espère que cela aidera quelqu'un ! Faites-moi savoir ce que vous en pensez !
C'est l'implémentation de Kotlin de la réponse de @Studio2bDesigns, qui permet de créer une boîte de dialogue d'entrée de texte via une mise en page personnalisée. Je l'ai utilisé pour la boîte de dialogue des paramètres, c'est pourquoi j'ai utilisé des noms de variables différents.
val alertDialog = AlertDialog.Builder(this).create()
val settingsBinding = SettingsDialogBinding.inflate(layoutInflater) // SettingsDialogBinding fourni par View binding
alertDialog.setView(settingsBinding.root)
settingsBinding.etLink.setText("Un peu de texte ici")
settingsBinding.btnSave.setOnClickListener {
if (settingsBinding.etLink.text.toString().isNotBlank()) {
Toast.makeText(this, "Vous avez saisi une valeur!", Toast.LENGTH_LONG).show()
} else {
Toast.makeText(this, "Veuillez saisir une valeur!", Toast.LENGTH_LONG).show()
}
}
settingsBinding.btnCancel.setOnClickListener {
alertDialog.dismiss() // fermer la boîte de dialogue
}
alertDialog.show()
- Réponses précédentes
- Plus de réponses