Le Tutoriel de Android Dialog

View more Tutorials:

1- Android Dialog

Sous AndroidDialog (la boîte de dialogue) est une petite fenêtre qui apparaît pour inviter l'utilisateur à prendre une décision ou à entrer des informations supplémentaires. Dialog ne remplit pas tout l'écran et s'affiche généralement en mode modal, ce qui signifie que les utilisateurs doivent prendre la décision de la fermer avant d'interagir avec d'autres parties de l'application.
Si vous voulez un  Dialog, écrivez une classe d'extension à partir de la classe Dialog ou utilisez ses sous-classes existantes, loin d'utiliser directement la classe Dialog.

AlertDialog

AlertDialog est une sous-classe directe de Dialog, elle a une zone d'en-tête, une zone de contenu et a 1, 2 ou 3 boutons. Il est facile d'obtenir une boîte de dialogue avec seulement quelques lignes de code.
  • TODO Link!

CharacterPickerDialog

Android CharacterPickerDialog est une boîte de dialogue qui permet à l'utilisateur de sélectionner des "caractères accentués"  (accented characters) d'un caractère de base. Parfois, CharacterPickerDialog est utile car tous les téléphones des utilisateurs n'ont pas une disposition de clavier (Keyboard Layout) adaptée à une langue particulière.

DatePickerDialog & TimePickerDialog

Permet aux utilisateurs de sélectionner une date ou une heure (time).

ProgressDialog

ProgressDialog est une boîte de dialogue affichant une progression (progress), ce qui est fondamentalement dangereux car il empêche les utilisateurs d'interagir avec l'application lorsque cette boîte de dialogue s'affiche (Progression non terminée). Vous devriez envisager d'utiliser ProgressBar au lieu de ProgressDialog.
  • TODO Link!

DialogFragment vs Dialog

Les  Dialog sont créées et affichées dans une Activity, elles ne disposent pas de méthodes callback pour pouvoir identifier l'état du cycle de vie de Activity, donc votre Activity doit parfois indiquer à  Dialog quoi faire dans des moments différents.

Pour faciliter la compréhension, j'ai mis en place une situation: votre application affiche   Dialog avec des données, l'utilisateur n'a pas, pour une raison quelconque, interagi avec l'appareil depuis suffisamment longtemps, l'appareil va planter. en mode veille, la méthode onPause() de  l'Activity sera appelée pour suspendre (pause) l'application. Lorsque l'utilisateur revient et interagit avec l'appareil, la méthode onResume() de   l'Activity sera appelée pour redémarrer (Resume) l'application. Vous devez écrire du code dans onResume() pour dire à  Dialog d'actualiser les données qu'elle affiche, bien sûr avec les  Dialog juste pour afficher les notifications, ou pour afficher les données fixes que vous n'avez pas à le faire.
DialogFragment est un Fragment qui contient un  Dialog, il a des méthodes de callback pour se rendre compte des différents états dans le cycle de vie de l'Activity, donc DialogFragment peut faire des choses intelligentes par lui-même au lieu de suivre les instructions d'Activity. De plus, les  Dialog seront fermées lorsque les utilisateurs feront pivoter (rotate) l'écran du téléphone, tandis que DialogFragment est plus convivial, il tournera en fonction de l'orientation de l'écran.
C'est pourquoi dans certaines applications complexes, vous devez utiliser DialogFragment au lieu de Dialog, cela rend votre code plus transparent. Mais ne vous inquiétez pas, l'utilisation de Dialog est très pratique dans la plupart des cas.
  • TODO Link!

2- Exemple de Dialog personnalisable

Exemple d'aperçu:
Sur Android Studio, créez un nouveau project:
  • File > New > New Project > Empty Activity
    • Name: CustomDialogExample
    • Package name: org.o7planning.customdialogexample
    • Language: Java
Nous allons d'abord concevoir l'interface de dialog:
  • File > New > Android Resource File
    • File name: layout_custom_dialog.xml
    • Resource type: Layout
    • Root element: androidx.constraintlayout.widget.ConstraintLayout
    • Directory name: layout
Conception d'interface pour  Dialog personnalisée:
Définissez l' ID, Text des composants sur l'interface:
layout_custom_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp"
        android:text="Enter Your Name:"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/editText_fullName"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:ems="10"
        android:hint="Name"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <Button
        android:id="@+id/button_cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:text="Cancel"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText_fullName" />

    <Button
        android:id="@+id/button_ok"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:text="OK"
        app:layout_constraintEnd_toStartOf="@+id/button_cancel"
        app:layout_constraintTop_toBottomOf="@+id/editText_fullName" />
</androidx.constraintlayout.widget.ConstraintLayout>
Créez une classe CustomDialog s'étendant de la classe Dialog:
CustomDialog.java
package org.o7planning.customdialogexample;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class CustomDialog extends Dialog {

    interface FullNameListener {
        public void fullNameEntered(String fullName);
    }

    public Context context;

    private EditText editTextFullName;
    private Button buttonOK;
    private Button buttonCancel;

    private CustomDialog.FullNameListener listener;

    public CustomDialog(Context context, CustomDialog.FullNameListener listener) {
        super(context);
        this.context = context;
        this.listener = listener;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.layout_custom_dialog);

        this.editTextFullName = (EditText) findViewById(R.id.editText_fullName);
        this.buttonOK = (Button) findViewById(R.id.button_ok);
        this.buttonCancel  = (Button) findViewById(R.id.button_cancel);

        this.buttonOK .setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 buttonOKClick();
            }
        });
        this.buttonCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 buttonCancelClick();
            }
        });
    }

    // User click "OK" button.
    private void buttonOKClick()  {
        String fullName = this.editTextFullName.getText().toString();

        if(fullName== null || fullName.isEmpty())  {
            Toast.makeText(this.context, "Please enter your name", Toast.LENGTH_LONG).show();
            return;
        }
        this.dismiss(); // Close Dialog

        if(this.listener!= null)  {
            this.listener.fullNameEntered(fullName);
        }
    }

    // User click "Cancel" button.
    private void buttonCancelClick()  {
        this.dismiss();
    }
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button_openDialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="Open Dialog"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
package org.o7planning.customdialogexample;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Button buttonOpenDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.buttonOpenDialog = (Button) this.findViewById(R.id.button_openDialog);

        this.buttonOpenDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                buttonOpenDialogClicked();
            }
        });
    }

    private void buttonOpenDialogClicked()  {
        CustomDialog.FullNameListener listener = new CustomDialog.FullNameListener() {
            @Override
            public void fullNameEntered(String fullName) {
                Toast.makeText(MainActivity.this, "Full name: " + fullName, Toast.LENGTH_LONG).show();
            }
        };
        final CustomDialog dialog = new CustomDialog(this, listener);

        dialog.show();
    }
}

View more Tutorials: