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">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
ouTimePickerDialog
- Boîte de dialogue avec une UI prédéfinie, qui permet à l'utilisateur de sélectionner une date ou en temps réel.
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'action](https://developer.android.google.cn/static/images/ui/dialog_buttons.png?authuser=0000&hl=fr)
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'action.](https://developer.android.google.cn/static/images/ui/alert_dialog_1.png?authuser=0000&hl=fr)
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'alerte avec un titre, un message et deux boutons d'action.](https://developer.android.google.cn/static/images/ui/alert_dialog_2.png?authuser=0000&hl=fr)
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.](https://developer.android.google.cn/static/images/ui/alert_dialog_3.png?authuser=0000&hl=fr)
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 :
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'éléments à choix multiples.](https://developer.android.google.cn/static/images/ui/alert_dialog_4.png?authuser=0000&hl=fr)
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'éléments à choix unique.](https://developer.android.google.cn/static/images/ui/alert_dialog_5.png?authuser=0000&hl=fr)
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.](https://developer.android.google.cn/static/images/ui/dialog_custom.png?authuser=0000&hl=fr)
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>
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
.