Boîtes de dialogue

Essayer Compose
Jetpack Compose est le kit d'outils d'interface utilisateur recommandé pour Android. Découvrez comment ajouter des composants dans Compose.
<ph type="x-smartling-placeholder"></ph> AlertDialog →

Une boîte de dialogue est une petite fenêtre qui invite l'utilisateur à créer une ou saisir des informations complémentaires. Une boîte de dialogue ne remplit pas l’écran et est généralement utilisée pour les événements modaux qui obligent les utilisateurs à effectuer une action avant il peut continuer.

<ph type="x-smartling-placeholder"> <ph type="x-smartling-placeholder">
</ph> Image montrant une boîte de dialogue de base <ph type="x-smartling-placeholder">
</ph> Figure 1 : Boîte de dialogue de base

Dialog est la classe de base pour les boîtes de dialogue, mais n'instanciez pas Dialog. directement. Utilisez plutôt l'une des sous-classes suivantes:

AlertDialog
Boîte de dialogue pouvant afficher un titre, jusqu'à trois boutons et une liste de boutons ou une mise en page personnalisée.
DatePickerDialog ou TimePickerDialog
Boîte de dialogue avec une UI prédéfinie, qui permet à l'utilisateur de sélectionner une date ou en temps réel.
<ph type="x-smartling-placeholder">

Ces classes définissent le style et la structure de votre boîte de dialogue. Vous devez également un DialogFragment en tant que conteneur pour votre boîte de dialogue. La classe DialogFragment fournit toutes les commandes dont vous avez besoin pour créer votre boîte de dialogue et en gérer l'apparence, au lieu d'appeler des méthodes sur l'objet Dialog.

Utiliser DialogFragment pour gérer la boîte de dialogue permet gérer les événements de cycle de vie, comme lorsque l'utilisateur appuie sur le bouton "Retour" ou effectue une rotation l'écran. La classe DialogFragment vous permet également de réutiliser d'une boîte de dialogue en tant que composant intégrable dans une interface utilisateur plus grande, comme traditionnel Fragment : comme comme lorsque vous voulez que l'interface utilisateur de la boîte de dialogue s'affiche différemment sur les grandes et les petites écrans.

Les sections suivantes de ce document expliquent comment utiliser un DialogFragment en combinaison avec AlertDialog . Si vous souhaitez créer un sélecteur de date ou d'heure, consultez Ajoutez des sélecteurs à votre l'application Nest.

Créer un fragment de boîte de dialogue

Vous pouvez concevoir de nombreuses boîtes de dialogue, y compris des mises en page et celles décrites dans Material Design les boîtes de dialogue, en étendant DialogFragment et en créant une AlertDialog dans la onCreateDialog() .

Par exemple, voici un AlertDialog de base géré dans un DialogFragment:

Kotlin

class StartGameDialogFragment : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity?.let {
            // Use the Builder class for convenient dialog construction.
            val builder = AlertDialog.Builder(it)
            builder.setMessage("Start game")
                .setPositiveButton("Start") { dialog, id ->
                    // START THE GAME!
                }
                .setNegativeButton("Cancel") { dialog, id ->
                    // User cancelled the dialog.
                }
            // Create the AlertDialog object and return it.
            builder.create()
        } ?: throw IllegalStateException("Activity cannot be null")
    }
}

class OldXmlActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_old_xml)

        StartGameDialogFragment().show(supportFragmentManager, "GAME_DIALOG")
    }
}

Java

public class StartGameDialogFragment extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the Builder class for convenient dialog construction.
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.dialog_start_game)
               .setPositiveButton(R.string.start, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // START THE GAME!
                   }
               })
               .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // User cancels the dialog.
                   }
               });
        // Create the AlertDialog object and return it.
        return builder.create();
    }
}
// ...

StartGameDialogFragment().show(supportFragmentManager, "GAME_DIALOG");

Lorsque vous créez une instance de cette classe et appelez show() sur cet objet, la boîte de dialogue s'affiche, comme illustré dans la figure suivante.

Image montrant une boîte de dialogue de base avec deux boutons d&#39;action
Figure 2 : Une boîte de dialogue contenant un message et deux boutons d'action.

La section suivante explique plus en détail comment utiliser AlertDialog.Builder API permettant de créer la boîte de dialogue.

Selon la complexité de votre boîte de dialogue, vous pouvez implémenter diverses d'autres méthodes de rappel dans DialogFragment, y compris toutes les des méthodes de cycle de vie des fragments de base.

Créer une boîte de dialogue d'alerte

La classe AlertDialog vous permet de créer diverses boîtes de dialogue et est souvent la seule classe de dialogue dont vous avez besoin. Comme indiqué ci-dessous figure trois parties d'une boîte de dialogue d'alerte:

  • Titre:facultatif et utilisé uniquement lorsque la zone de contenu est occupée par un message détaillé, une liste ou une mise en page personnalisée. Si vous avez besoin de énoncez un message ou une question simple, vous n'avez pas besoin d'un titre.
  • Zone de contenu:permet d'afficher un message, une liste ou d'autres mise en page.
  • Boutons d'action:jusqu'à trois boutons d'action .

La classe AlertDialog.Builder fournit des API qui vous permettent de créer une AlertDialog avec ce type de contenu, y compris un mise en page.

Pour créer une AlertDialog, procédez comme suit:

Kotlin

val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder
    .setMessage("I am the message")
    .setTitle("I am the title")

val dialog: AlertDialog = builder.create()
dialog.show()

Java

// 1. Instantiate an AlertDialog.Builder with its constructor.
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

// 2. Chain together various setter methods to set the dialog characteristics.
builder.setMessage(R.string.dialog_message)
       .setTitle(R.string.dialog_title);

// 3. Get the AlertDialog.
AlertDialog dialog = builder.create();

L'extrait de code précédent génère cette boîte de dialogue:

Image montrant une boîte de dialogue avec un titre, une zone de contenu et deux boutons d&#39;action.
Figure 3 : La disposition d'une alerte de base .

Ajouter des boutons

Pour ajouter des boutons d'action comme ceux de la figure 2, appelez la méthode setPositiveButton() et setNegativeButton() méthodes:

Kotlin

val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder
    .setMessage("I am the message")
    .setTitle("I am the title")
    .setPositiveButton("Positive") { dialog, which ->
        // Do something.
    }
    .setNegativeButton("Negative") { dialog, which ->
        // Do something else.
    }

val dialog: AlertDialog = builder.create()
dialog.show()

Java

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Add the buttons.
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               // User taps OK button.
           }
       });
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               // User cancels the dialog.
           }
       });
// Set other dialog properties.
...

// Create the AlertDialog.
AlertDialog dialog = builder.create();

Les méthodes set...Button() nécessitent un titre pour la fourni par un ressource de chaîne, et un DialogInterface.OnClickListener qui définit l'action à effectuer lorsque l'utilisateur appuie sur le bouton.

Vous pouvez ajouter trois boutons d'action:

  • Positive:utilisez cet élément pour accepter et poursuivre l'action (les "OK" action).
  • Négatif:utilisez ce paramètre pour annuler l'action.
  • Neutre:utilisez cette option si l'utilisateur ne souhaite pas poursuivre mais ne veut pas nécessairement annuler. Il apparaît entre les les boutons positif et négatif. Par exemple, l'action peut être "M'envoyer un rappel plus tard. »

Vous ne pouvez ajouter qu'un seul bouton de chaque type à une AlertDialog. Pour Par exemple, vous ne pouvez pas avoir plusieurs valeurs "positives" .

L'extrait de code précédent affiche une boîte de dialogue d'alerte semblable à celle-ci:

Image montrant une boîte de dialogue d&#39;alerte avec un titre, un message et deux boutons d&#39;action.
Figure 4 : Une boîte de dialogue d'alerte avec un titre, un message et deux boutons d'action.

Ajouter une liste

Trois types de listes sont disponibles avec AlertDialog. API:

  • Liste traditionnelle à choix unique.
  • Liste persistante à choix unique (cases d'option)
  • Liste persistante à choix multiples (cases à cocher).

Pour créer une liste à choix unique comme celle de la figure 5, utilisez la setItems() méthode:


Kotlin

val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder
    .setTitle("I am the title")
    .setPositiveButton("Positive") { dialog, which ->
        // Do something.
    }
    .setNegativeButton("Negative") { dialog, which ->
        // Do something else.
    }
    .setItems(arrayOf("Item One", "Item Two", "Item Three")) { dialog, which ->
        // Do something on item tapped.
    }

val dialog: AlertDialog = builder.create()
dialog.show()

Java

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle(R.string.pick_color)
           .setItems(R.array.colors_array, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int which) {
               // The 'which' argument contains the index position of the selected item.
           }
    });
    return builder.create();
}

Cet extrait de code génère une boîte de dialogue semblable à celle-ci:

Image montrant une boîte de dialogue avec un titre et une liste.
Figure 5 : Boîte de dialogue avec un titre et une liste

La liste ne s'affiche pas, car la liste apparaît dans la zone de contenu de la boîte de dialogue. à la fois un message et une liste. Donnez un titre à la boîte de dialogue avec setTitle() Pour spécifier les éléments de la liste, appelez setItems() en transmettant une tableau. Vous pouvez également spécifier une liste à l'aide de setAdapter() Vous pouvez ainsi sauvegarder la liste avec des données dynamiques, par exemple à partir d'une base de données), à l'aide d'un ListAdapter

Si vous sauvegardez votre liste avec un ListAdapter, utilisez toujours un Loader afin que le contenu se charge de manière asynchrone. Ceci est décrit plus en détail dans Créer des mises en page à l'aide d'un adaptateur Chargeurs :

<ph type="x-smartling-placeholder">

Ajouter une liste persistante à choix multiples ou à choix unique

Pour ajouter une liste d'éléments à choix multiples (cases à cocher) ou à choix unique (cases d'option), utilisez la setMultiChoiceItems() ou setSingleChoiceItems() .

Par exemple, voici comment vous pouvez créer une liste à choix multiples comme celle comme illustré dans la figure 6, qui enregistre les éléments sélectionnés ArrayList:

Kotlin

val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder
    .setTitle("I am the title")
    .setPositiveButton("Positive") { dialog, which ->
        // Do something.
    }
    .setNegativeButton("Negative") { dialog, which ->
        // Do something else.
    }
    .setMultiChoiceItems(
        arrayOf("Item One", "Item Two", "Item Three"), null) { dialog, which, isChecked ->
        // Do something.
    }

val dialog: AlertDialog = builder.create()
dialog.show()

Java

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    selectedItems = new ArrayList();  // Where we track the selected items
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Set the dialog title.
    builder.setTitle(R.string.pick_toppings)
    // Specify the list array, the items to be selected by default (null for
    // none), and the listener through which to receive callbacks when items
    // are selected.
           .setMultiChoiceItems(R.array.toppings, null,
                      new DialogInterface.OnMultiChoiceClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int which,
                       boolean isChecked) {
                   if (isChecked) {
                       // If the user checks the item, add it to the selected
                       // items.
                       selectedItems.add(which);
                   } else if (selectedItems.contains(which)) {
                       // If the item is already in the array, remove it.
                       selectedItems.remove(which);
                   }
               }
           })
    // Set the action buttons
           .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int id) {
                   // User taps OK, so save the selectedItems results
                   // somewhere or return them to the component that opens the
                   // dialog.
                   ...
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int id) {
                   ...
               }
           });

    return builder.create();
}
Image montrant une boîte de dialogue contenant une liste d&#39;éléments à choix multiples.
Figure 6. Liste d'éléments à choix multiples.

Vous pouvez obtenir une boîte de dialogue d'alerte à choix unique comme celle-ci:

Kotlin

val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder
    .setTitle("I am the title")
    .setPositiveButton("Positive") { dialog, which ->
        // Do something.
    }
    .setNegativeButton("Negative") { dialog, which ->
        // Do something else.
    }
    .setSingleChoiceItems(
        arrayOf("Item One", "Item Two", "Item Three"), 0
    ) { dialog, which ->
        // Do something.
    }

val dialog: AlertDialog = builder.create()
dialog.show()

Java

        String[] choices = {"Item One", "Item Two", "Item Three"};
        
        AlertDialog.Builder builder = AlertDialog.Builder(context);
        builder
                .setTitle("I am the title")
                .setPositiveButton("Positive", (dialog, which) -> {

                })
                .setNegativeButton("Negative", (dialog, which) -> {

                })
                .setSingleChoiceItems(choices, 0, (dialog, which) -> {

                });

        AlertDialog dialog = builder.create();
        dialog.show();

Cela se traduit par l'exemple suivant:

Image montrant une boîte de dialogue contenant une liste d&#39;éléments à choix unique.
Figure 7. Liste d'éléments à choix unique.

Créer une mise en page personnalisée

Si vous souhaitez utiliser une mise en page personnalisée dans une boîte de dialogue, créez une mise en page et ajoutez-la à une AlertDialog en appelant setView() sur votre objet AlertDialog.Builder.

Image montrant une mise en page de boîte de dialogue personnalisée.
Figure 8 : Une mise en page de boîte de dialogue personnalisée.

Par défaut, la mise en page personnalisée remplit la boîte de dialogue, mais vous pouvez toujours utiliser Méthodes AlertDialog.Builder pour ajouter des boutons et un titre

Par exemple, voici le fichier de mise en page de la boîte de dialogue personnalisée précédente mise en page:

res/layout/dialog_signin.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ImageView
        android:src="@drawable/header_logo"
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:scaleType="center"
        android:background="#FFFFBB33"
        android:contentDescription="@string/app_name" />
    <EditText
        android:id="@+id/username"
        android:inputType="textEmailAddress"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="4dp"
        android:hint="@string/username" />
    <EditText
        android:id="@+id/password"
        android:inputType="textPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="16dp"
        android:fontFamily="sans-serif"
        android:hint="@string/password"/>
</LinearLayout>
<ph type="x-smartling-placeholder">

Pour gonfler la mise en page dans votre DialogFragment, obtenez une LayoutInflater par getLayoutInflater() et appelez inflate() Le premier paramètre est l'ID de ressource de mise en page, et le second est un la vue parent de la mise en page. Vous pouvez ensuite appeler setView() pour placer la mise en page dans la boîte de dialogue. Ce processus est illustré dans l'exemple suivant.

Kotlin

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    return activity?.let {
        val builder = AlertDialog.Builder(it)
        // Get the layout inflater.
        val inflater = requireActivity().layoutInflater;

        // Inflate and set the layout for the dialog.
        // Pass null as the parent view because it's going in the dialog
        // layout.
        builder.setView(inflater.inflate(R.layout.dialog_signin, null))
                // Add action buttons.
                .setPositiveButton(R.string.signin,
                        DialogInterface.OnClickListener { dialog, id ->
                            // Sign in the user.
                        })
                .setNegativeButton(R.string.cancel,
                        DialogInterface.OnClickListener { dialog, id ->
                            getDialog().cancel()
                        })
        builder.create()
    } ?: throw IllegalStateException("Activity cannot be null")
}

Java

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Get the layout inflater.
    LayoutInflater inflater = requireActivity().getLayoutInflater();

    // Inflate and set the layout for the dialog.
    // Pass null as the parent view because it's going in the dialog layout.
    builder.setView(inflater.inflate(R.layout.dialog_signin, null))
    // Add action buttons
           .setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int id) {
                   // Sign in the user.
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   LoginDialogFragment.this.getDialog().cancel();
               }
           });
    return builder.create();
}

Si vous voulez une boîte de dialogue personnalisée, vous pouvez afficher à la place une Activity en tant que au lieu d'utiliser les API Dialog. Créer une activité et définir son thème sur Theme.Holo.Dialog dans <activity> du fichier manifeste:

<activity android:theme="@android:style/Theme.Holo.Dialog" >

L'activité s'affiche désormais dans une boîte de dialogue au lieu du plein écran.

Transmettre les événements à l'hôte de la boîte de dialogue

Lorsque l'utilisateur appuie sur l'un des boutons d'action de la boîte de dialogue ou sélectionne un élément de sa liste, votre DialogFragment peut effectuer les actions action proprement dite, mais vous souhaitez souvent transmettre l'événement à l'activité fragment qui ouvre la boîte de dialogue. Pour ce faire, définissez une interface avec une méthode pour chaque type d'événement de clic. Implémentez ensuite cette interface dans l'hôte qui reçoit les événements d'action de la boîte de dialogue.

Par exemple, voici un élément DialogFragment qui définit une interface qui renvoie les événements à l'activité hôte:

Kotlin

class NoticeDialogFragment : DialogFragment() {
    // Use this instance of the interface to deliver action events.
    internal lateinit var listener: NoticeDialogListener

    // The activity that creates an instance of this dialog fragment must
    // implement this interface to receive event callbacks. Each method passes
    // the DialogFragment in case the host needs to query it.
    interface NoticeDialogListener {
        fun onDialogPositiveClick(dialog: DialogFragment)
        fun onDialogNegativeClick(dialog: DialogFragment)
    }

    // Override the Fragment.onAttach() method to instantiate the
    // NoticeDialogListener.
    override fun onAttach(context: Context) {
        super.onAttach(context)
        // Verify that the host activity implements the callback interface.
        try {
            // Instantiate the NoticeDialogListener so you can send events to
            // the host.
            listener = context as NoticeDialogListener
        } catch (e: ClassCastException) {
            // The activity doesn't implement the interface. Throw exception.
            throw ClassCastException((context.toString() +
                    " must implement NoticeDialogListener"))
        }
    }
}

Java

public class NoticeDialogFragment extends DialogFragment {

    // The activity that creates an instance of this dialog fragment must
    // implement this interface to receive event callbacks. Each method passes
    // the DialogFragment in case the host needs to query it.
    public interface NoticeDialogListener {
        public void onDialogPositiveClick(DialogFragment dialog);
        public void onDialogNegativeClick(DialogFragment dialog);
    }

    // Use this instance of the interface to deliver action events.
    NoticeDialogListener listener;

    // Override the Fragment.onAttach() method to instantiate the
    // NoticeDialogListener.
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        // Verify that the host activity implements the callback interface.
        try {
            // Instantiate the NoticeDialogListener so you can send events to
            // the host.
            listener = (NoticeDialogListener) context;
        } catch (ClassCastException e) {
            // The activity doesn't implement the interface. Throw exception.
            throw new ClassCastException(activity.toString()
                    + " must implement NoticeDialogListener");
        }
    }
    ...
}

L'activité qui héberge la boîte de dialogue crée une instance de la boîte de dialogue avec l'élément constructeur de la boîte de dialogue et reçoit les événements de la boîte de dialogue via une Implémentation de l'interface NoticeDialogListener:

Kotlin

class MainActivity : FragmentActivity(),
        NoticeDialogFragment.NoticeDialogListener {

    fun showNoticeDialog() {
        // Create an instance of the dialog fragment and show it.
        val dialog = NoticeDialogFragment()
        dialog.show(supportFragmentManager, "NoticeDialogFragment")
    }

    // The dialog fragment receives a reference to this Activity through the
    // Fragment.onAttach() callback, which it uses to call the following
    // methods defined by the NoticeDialogFragment.NoticeDialogListener
    // interface.
    override fun onDialogPositiveClick(dialog: DialogFragment) {
        // User taps the dialog's positive button.
    }

    override fun onDialogNegativeClick(dialog: DialogFragment) {
        // User taps the dialog's negative button.
    }
}

Java

public class MainActivity extends FragmentActivity
                          implements NoticeDialogFragment.NoticeDialogListener{
    ...
    public void showNoticeDialog() {
        // Create an instance of the dialog fragment and show it.
        DialogFragment dialog = new NoticeDialogFragment();
        dialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
    }

    // The dialog fragment receives a reference to this Activity through the
    // Fragment.onAttach() callback, which it uses to call the following
    // methods defined by the NoticeDialogFragment.NoticeDialogListener
    // interface.
    @Override
    public void onDialogPositiveClick(DialogFragment dialog) {
        // User taps the dialog's positive button.
        ...
    }

    @Override
    public void onDialogNegativeClick(DialogFragment dialog) {
        // User taps the dialog's negative button.
        ...
    }
}

Comme l'activité hôte implémente le NoticeDialogListener, qui est appliquée par onAttach() de rappel présentée dans l'exemple précédent. Le fragment de boîte de dialogue peut Utilisez les méthodes de rappel de l'interface pour diffuser des événements de clic dans l'activité:

Kotlin

    override fun onCreateDialog(savedInstanceState: Bundle): Dialog {
        return activity?.let {
            // Build the dialog and set up the button click handlers.
            val builder = AlertDialog.Builder(it)

            builder.setMessage(R.string.dialog_start_game)
                    .setPositiveButton(R.string.start,
                            DialogInterface.OnClickListener { dialog, id ->
                                // Send the positive button event back to the
                                // host activity.
                                listener.onDialogPositiveClick(this)
                            })
                    .setNegativeButton(R.string.cancel,
                            DialogInterface.OnClickListener { dialog, id ->
                                // Send the negative button event back to the
                                // host activity.
                                listener.onDialogNegativeClick(this)
                            })

            builder.create()
        } ?: throw IllegalStateException("Activity cannot be null")
    }

Java

public class NoticeDialogFragment extends DialogFragment {
    ...
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Build the dialog and set up the button click handlers.
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.dialog_start_game)
               .setPositiveButton(R.string.start, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // Send the positive button event back to the host activity.
                       listener.onDialogPositiveClick(NoticeDialogFragment.this);
                   }
               })
               .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // Send the negative button event back to the host activity.
                       listener.onDialogNegativeClick(NoticeDialogFragment.this);
                   }
               });
        return builder.create();
    }
}

Afficher une boîte de dialogue

Lorsque vous souhaitez afficher la boîte de dialogue, créez une instance de votre DialogFragment et appeler show(), en transmettant FragmentManager et un nom de tag pour le fragment de boîte de dialogue.

Vous pouvez obtenir le FragmentManager en appelant getSupportFragmentManager() à partir de FragmentActivity ou en appelant getParentFragmentManager() à partir d'un Fragment. Voici un exemple:

Kotlin

fun confirmStartGame() {
    val newFragment = StartGameDialogFragment()
    newFragment.show(supportFragmentManager, "game")
}

Java

public void confirmStartGame() {
    DialogFragment newFragment = new StartGameDialogFragment();
    newFragment.show(getSupportFragmentManager(), "game");
}

Le deuxième argument, "game", est un nom de balise unique que le pour enregistrer et restaurer l'état du fragment si nécessaire. La balise vous permet d'obtenir un handle vers le fragment en appelant findFragmentByTag()

Afficher une boîte de dialogue en plein écran ou en tant que fragment intégré

Vous pouvez souhaiter qu'une partie de la conception de votre interface utilisateur apparaisse sous la forme d'une boîte de dialogue dans certains et en tant que fragment en plein écran ou intégré dans d'autres cas. Vous pourriez également voulez qu'elle s'affiche différemment selon la taille de l'écran de l'appareil. La La classe DialogFragment offre plus de flexibilité pour cela, car il peut se comporter comme un élément Fragment intégrable.

Toutefois, vous ne pouvez pas utiliser AlertDialog.Builder ni d'autres Dialog pour créer la boîte de dialogue dans ce cas. Si vous souhaitez que DialogFragment pour être intégrable, définissez l'UI de la boîte de dialogue dans une puis chargez la mise en page dans onCreateView() .

Voici un exemple de DialogFragment qui peut apparaître sous la forme d'une boîte de dialogue ou un fragment intégrable, à l'aide d'une mise en page nommée purchase_items.xml:

Kotlin

class CustomDialogFragment : DialogFragment() {

    // The system calls this to get the DialogFragment's layout, regardless of
    // whether it's being displayed as a dialog or an embedded fragment.
    override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View {
        // Inflate the layout to use as a dialog or embedded fragment.
        return inflater.inflate(R.layout.purchase_items, container, false)
    }

    // The system calls this only when creating the layout in a dialog.
    override fun onCreateDialog(savedInstanceState: Bundle): Dialog {
        // The only reason you might override this method when using
        // onCreateView() is to modify the dialog characteristics. For example,
        // the dialog includes a title by default, but your custom layout might
        // not need it. Here, you can remove the dialog title, but you must
        // call the superclass to get the Dialog.
        val dialog = super.onCreateDialog(savedInstanceState)
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
        return dialog
    }
}

Java

public class CustomDialogFragment extends DialogFragment {
    // The system calls this to get the DialogFragment's layout, regardless of
    // whether it's being displayed as a dialog or an embedded fragment.
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout to use as a dialog or embedded fragment.
        return inflater.inflate(R.layout.purchase_items, container, false);
    }

    // The system calls this only when creating the layout in a dialog.
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // The only reason you might override this method when using
        // onCreateView() is to modify the dialog characteristics. For example,
        // the dialog includes a title by default, but your custom layout might
        // not need it. Here, you can remove the dialog title, but you must
        // call the superclass to get the Dialog.
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        return dialog;
    }
}

L'exemple suivant détermine s'il faut afficher le fragment sous forme de boîte de dialogue ou une UI plein écran, en fonction de la taille de l'écran:

Kotlin

fun showDialog() {
    val fragmentManager = supportFragmentManager
    val newFragment = CustomDialogFragment()
    if (isLargeLayout) {
        // The device is using a large layout, so show the fragment as a
        // dialog.
        newFragment.show(fragmentManager, "dialog")
    } else {
        // The device is smaller, so show the fragment fullscreen.
        val transaction = fragmentManager.beginTransaction()
        // For a polished look, specify a transition animation.
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
        // To make it fullscreen, use the 'content' root view as the container
        // for the fragment, which is always the root view for the activity.
        transaction
                .add(android.R.id.content, newFragment)
                .addToBackStack(null)
                .commit()
    }
}

Java

public void showDialog() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    CustomDialogFragment newFragment = new CustomDialogFragment();

    if (isLargeLayout) {
        // The device is using a large layout, so show the fragment as a
        // dialog.
        newFragment.show(fragmentManager, "dialog");
    } else {
        // The device is smaller, so show the fragment fullscreen.
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        // For a polished look, specify a transition animation.
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        // To make it fullscreen, use the 'content' root view as the container
        // for the fragment, which is always the root view for the activity.
        transaction.add(android.R.id.content, newFragment)
                   .addToBackStack(null).commit();
    }
}

Pour en savoir plus sur l'exécution de transactions de fragment, consultez Fragments :

Dans cet exemple, la valeur booléenne mIsLargeLayout indique si l'appareil actuel doit utiliser la mise en page de grande taille de l'application et afficher donc fragment en tant que boîte de dialogue plutôt que en plein écran. La meilleure façon de définir ce type "booléen" consiste à déclarer Ressource booléenne par une valeur alternative resource pour différentes tailles d'écran. Par exemple, voici deux versions de la ressource bool pour différentes tailles d'écran:

res/values/bools.xml

<!-- Default boolean values -->
<resources>
    <bool name="large_layout">false</bool>
</resources>

res/values-large/bools.xml

<!-- Large screen boolean values -->
<resources>
    <bool name="large_layout">true</bool>
</resources>

Vous pouvez ensuite initialiser la valeur mIsLargeLayout lors de la activité onCreate() , comme illustré dans l'exemple suivant:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    isLargeLayout = resources.getBoolean(R.bool.large_layout)
}

Java

boolean isLargeLayout;

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

    isLargeLayout = getResources().getBoolean(R.bool.large_layout);
}

Afficher une activité dans une boîte de dialogue sur les grands écrans

Au lieu d'afficher une boîte de dialogue en mode plein écran sur les petits écrans, vous pouvez obtenir le même résultat en affichant un Activity sous la forme d'une boîte de dialogue sur de grands écrans. L'approche que vous choisissez dépend de la conception de votre application, mais montrer une l'activité sous forme de boîte de dialogue est souvent utile lorsque votre application est conçue pour et que vous souhaitez améliorer l'expérience utilisateur sur les tablettes une activité de courte durée comme boîte de dialogue.

Pour n'afficher une activité dans une boîte de dialogue que sur les grands écrans, appliquez la Theme.Holo.DialogWhenLarge à l'élément du fichier manifeste <activity>:

<activity android:theme="@android:style/Theme.Holo.DialogWhenLarge" >

Pour savoir comment styliser vos activités avec des thèmes, consultez Styles et thèmes :

Fermer une boîte de dialogue

Lorsque l'utilisateur appuie sur un bouton d'action créé avec un AlertDialog.Builder, le système ferme la boîte de dialogue.

Le système ferme également la boîte de dialogue lorsque l'utilisateur appuie sur un élément de la boîte de dialogue. , sauf si elle contient des cases d'option ou des cases à cocher. Sinon, vous pouvez fermez manuellement la boîte de dialogue en appelant dismiss() sur votre DialogFragment.

Si vous devez effectuer certaines actions lorsque la boîte de dialogue disparaît, vous pouvez implémenter onDismiss() dans votre DialogFragment.

Vous pouvez également annuler une boîte de dialogue. Il s'agit d'un événement spécial qui indique que l'utilisateur quitte la boîte de dialogue sans terminer la tâche. Ce se produit si l'utilisateur appuie sur le bouton Retour ou appuie sur l'écran en dehors de la boîte de dialogue ou si vous appelez explicitement cancel() sur le Dialog, par exemple en réponse à une demande "Cancel" (Annuler) dans la section .

Comme le montre l'exemple précédent, vous pouvez répondre à l'événement d'annulation en implémentation onCancel() dans votre classe DialogFragment.

<ph type="x-smartling-placeholder">