359 votes

Dialogue de texte d'entrée Android

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 ?

6voto

BadCash Points 566

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

6voto

Studio2bDesigns Points 468

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

0voto

mxkmn Points 1

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X