Диалоговое окно – это небольшое окно, в котором пользователю предлагается принять решение или ввести дополнительную информацию. Диалоговое окно не занимает весь экран и обычно используется для модальных событий, требующих от пользователя выполнения действия, прежде чем он сможет продолжить работу.
Класс Dialog – это базовый класс для диалоговых окон, но не создавайте экземпляр Dialog напрямую. Вместо этого используйте один из следующих подклассов:
AlertDialog- Диалоговое окно, в котором можно показывать заголовок, до трех кнопок, список элементов для выбора или макет, заданный пользователем.
DatePickerDialogилиTimePickerDialog- Диалоговое окно с заранее заданным интерфейсом, в котором пользователь может выбрать дату или время.
Эти классы определяют стиль и структуру диалогового окна. Вам также понадобится элемент
DialogFragment
в качестве контейнера для диалогового окна. Класс DialogFragment предоставляет все необходимые элементы управления для создания диалогового окна и управления его внешним видом, а не вызывает методы объекта Dialog.
Использование DialogFragment для управления диалоговым окном позволяет правильно обрабатывать события жизненного цикла, например нажатие кнопки "Назад" или поворот экрана. Класс DialogFragment также позволяет повторно использовать интерфейс диалогового окна в качестве встроенного компонента в более крупном интерфейсе, как и традиционный Fragment, например если вы хотите, чтобы интерфейс диалогового окна выглядел по-разному на больших и маленьких экранах.
В следующих разделах этого документа описано, как использовать DialogFragment в сочетании с объектом AlertDialog. Если вы хотите создать выбор даты или времени, прочитайте статью Как добавить в приложение выбор даты и времени.
Как создать фрагмент диалогового окна
Вы можете создать диалоговое окно с любым дизайном, в том числе с собственным макетом и с макетом, описанным в разделе Диалоговые окна Material Design. Для этого расширьте класс DialogFragment и создайте класс AlertDialog в методе обратного вызова onCreateDialog().
Ниже приведен пример простого элемента AlertDialog, управляемого в элементе 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");
Когда вы создадите экземпляр этого класса и вызовете метод show() для этого объекта, появится диалоговое окно, как показано на рисунке ниже.
В следующем разделе вы найдете подробную информацию о том, как создать диалоговое окно с помощью API.AlertDialog.Builder
В зависимости от сложности диалогового окна в теге DialogFragment можно реализовать различные другие методы обратного вызова, в том числе все основные методы жизненного цикла фрагмента.
Как создать диалоговое окно с оповещением
Класс AlertDialog позволяет создавать диалоговые окна разных типов и часто является единственным необходимым классом. Как показано на рисунке ниже, в диалоговом окне оповещения есть три области:
- Заголовок. Этот элемент необязательный и используется только в том случае, если в области контента показывается подробное сообщение, список или макет. Если вам нужно написать простое сообщение или задать вопрос, заголовок не нужен.
- Область контента. Здесь может показываться сообщение, список или другой макет.
- Кнопки действий. В диалоговом окне может быть до трех кнопок действий.
Класс AlertDialog.Builder предоставляет API, которые позволяют создавать AlertDialog с контентом такого типа, в том числе с пользовательским макетом.
Чтобы создать AlertDialog, выполните следующие действия:
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();
Приведенный выше фрагмент кода создает следующее диалоговое окно:
Как добавить кнопки
Чтобы добавить командные кнопки, как на рисунке 2, вызовите методы setPositiveButton() и setNegativeButton():
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();
Для методов set...Button() требуется заголовок кнопки, который задается с помощью строкового ресурса, и DialogInterface.OnClickListener, определяющий действие, которое будет выполнено при нажатии кнопки.
Вы можете добавить три кнопки действий:
- Положительный ответ используется для подтверждения и продолжения действия (действие "ОК").
- Отрицательное значение используется для отмены действия.
- Нейтральный. Используйте этот вариант, если пользователь может не захотеть выполнять действие, но при этом не обязательно захочет отменить его. Она находится между кнопками "Нравится" и "Не нравится". Например, действие может быть "Напомнить позже".
В AlertDialog можно добавить только одну кнопку каждого типа. Например, нельзя добавить больше одной кнопки с положительным ответом.
Приведенный выше фрагмент кода создает диалоговое окно с предупреждением, как показано ниже.
Как создать список
В API AlertDialog доступны три типа списков:
- Традиционный список с одним вариантом выбора.
- Постоянный список с одним вариантом ответа (переключатели).
- Постоянный список с несколькими вариантами ответа (флажки).
Чтобы создать список с одним вариантом ответа, как на рисунке 5, используйте метод setItems():
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(); }
Этот фрагмент кода создает диалоговое окно, похожее на следующее:
Поскольку список появляется в области контента диалогового окна, в нем не могут одновременно показываться сообщение и список. Задайте название диалогового окна с помощью setTitle().
Чтобы указать элементы списка, вызовите метод setItems(), передав массив. Также можно указать список с помощью тега setAdapter().
Это позволяет использовать в списке динамические данные, например из базы данных, с помощью ListAdapter.
Если вы используете список с ListAdapter, всегда добавляйте Loader, чтобы контент загружался асинхронно. Подробнее об этом рассказывается в статьях Создание макетов с помощью адаптера и Загрузчики.
Как добавить постоянный список с возможностью выбора одного или нескольких вариантов
Чтобы добавить список вариантов с возможностью выбора нескольких ответов (флажки) или одного ответа (переключатели), используйте методы setMultiChoiceItems() или setSingleChoiceItems() соответственно.
Например, вот как создать список с несколькими вариантами ответа, как на рисунке 6, и сохранить выбранные элементы в 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(); }
Диалоговое окно с одним вариантом выбора можно получить следующим образом:
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();
В результате получится следующий пример:
Как создать собственный макет
Если вам нужен собственный макет диалогового окна, создайте его и добавьте в объект AlertDialog, вызвав метод setView() для объекта AlertDialog.Builder.
По умолчанию специальная разметка заполняет диалоговое окно, но вы можете использовать методы AlertDialog.Builder, чтобы добавить кнопки и заголовок.
Например, вот файл макета для показанного выше диалогового окна:
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>
Чтобы развернуть макет в методе DialogFragment, получите объект LayoutInflater с помощью метода getLayoutInflater() и вызовите метод inflate().
Первый параметр – это идентификатор ресурса макета, а второй – родительское представление для макета. Чтобы разместить макет в диалоговом окне, вызовите метод setView(). Это показано в следующем примере.
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(); }
Если вам нужно собственное диалоговое окно, вы можете показывать Activity как диалоговое окно, а не использовать API Dialog. Создайте действие и задайте для него тему Theme.Holo.Dialog в элементе манифеста <activity>:
<activity android:theme="@android:style/Theme.Holo.Dialog" >
Теперь действия отображаются в диалоговом окне, а не на весь экран.
Передавать события обратно в хост диалогового окна
Когда пользователь нажимает одну из командных кнопок в диалоговом окне или выбирает элемент из списка, ваш DialogFragment может выполнить необходимое действие самостоятельно, но часто вам нужно передать событие в Activity или фрагмент, который открывает диалоговое окно. Для этого определите интерфейс с методом для каждого типа события клика. Затем реализуйте этот интерфейс в компоненте хоста, который получает события действий из диалогового окна.
Например, ниже приведен код DialogFragment, который определяет интерфейс, через который события передаются обратно в основное действие:
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"); } } ... }
Объект activity, в котором размещается диалоговое окно, создает экземпляр диалогового окна с помощью конструктора фрагмента диалогового окна и получает события диалогового окна через реализацию интерфейса 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. ... } }
Поскольку основное действие реализует интерфейс NoticeDialogListener (что обеспечивается методом обратного вызова onAttach(), показанным в предыдущем примере), фрагмент диалогового окна может использовать методы обратного вызова интерфейса для передачи событий клика действию:
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(); } }
Как показать диалоговое окно
Когда вы захотите показать диалоговое окно, создайте экземпляр DialogFragment и вызовите show(), передав FragmentManager и название тега для фрагмента диалогового окна.
Чтобы получить FragmentManager, вызовите метод getSupportFragmentManager() из FragmentActivity или метод getParentFragmentManager() из Fragment. Пример:
Kotlin
fun confirmStartGame() { val newFragment = StartGameDialogFragment() newFragment.show(supportFragmentManager, "game") }
Java
public void confirmStartGame() { DialogFragment newFragment = new StartGameDialogFragment(); newFragment.show(getSupportFragmentManager(), "game"); }
Второй аргумент, "game", – это уникальное название тега, которое система использует для сохранения и восстановления состояния фрагмента при необходимости. Тег также позволяет получить дескриптор фрагмента, вызвав метод findFragmentByTag().
Как показывать диалоговое окно в полноэкранном режиме или в виде встроенного фрагмента
Иногда вам может понадобиться, чтобы элемент интерфейса отображался как диалоговое окно, а в других случаях – как фрагмент, встроенный в экран или занимающий его целиком. Кроме того, вы можете настроить показ разных версий в зависимости от размера экрана устройства. Класс DialogFragment позволяет сделать это гибко, поскольку он может работать как встраиваемый класс Fragment.
Однако в этом случае нельзя использовать объекты AlertDialog.Builder или другие объекты Dialog для создания диалогового окна. Если вы хотите, чтобы диалоговое окно DialogFragment можно было встраивать, определите его интерфейс в макете, а затем загрузите макет в обратном вызове onCreateView().
Вот пример DialogFragment, который может быть представлен в виде диалогового окна или встроенного фрагмента с макетом 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; } }
В следующем примере показано, как определить, следует ли показывать фрагмент в виде диалогового окна или полноэкранного интерфейса, на основе размера экрана:
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(); } }
Подробнее о транзакциях для работы с фрагментами…
В этом примере логическое значение mIsLargeLayout указывает, должен ли текущий экран использовать большой макет приложения и, следовательно, показывать этот фрагмент в виде диалогового окна, а не на весь экран. Лучший способ задать такое логическое значение – объявить логический ресурс с альтернативным ресурсом для экранов разных размеров. Например, ниже приведены две версии логического ресурса для экранов разных размеров:
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>
Затем вы можете инициализировать значение mIsLargeLayout во время метода onCreate() активности, как показано в следующем примере:
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); }
Как показывать активность в виде диалогового окна на больших экранах
Вместо того чтобы показывать диалоговое окно в полноэкранном режиме на небольших экранах, вы можете добиться того же результата, показывая Activity в виде диалогового окна на больших экранах. Выбор подхода зависит от дизайна приложения, но часто бывает полезно показывать активность в виде диалогового окна, если приложение предназначено для небольших экранов и вы хотите улучшить работу на планшетах, показывая кратковременную активность в виде диалогового окна.
Чтобы показывать объект activity в виде диалогового окна только на больших экранах, примените тему
Theme.Holo.DialogWhenLarge
к элементу манифеста <activity>:
<activity android:theme="@android:style/Theme.Holo.DialogWhenLarge" >
Подробнее о том, как задавать стили и темы для действий…
Как закрыть диалоговое окно
Когда пользователь нажимает командную кнопку, созданную с помощью AlertDialog.Builder, система закрывает диалоговое окно.
Система также закрывает диалоговое окно, когда пользователь нажимает на элемент в списке диалогового окна, за исключением случаев, когда в списке используются переключатели или флажки. В противном случае вы можете закрыть диалоговое окно вручную, вызвав метод dismiss() на объекте DialogFragment.
Если вам нужно выполнить определенные действия после того, как диалоговое окно исчезнет, вы можете реализовать метод onDismiss() в своем DialogFragment.
Вы также можете отменить диалоговое окно. Это специальное событие, которое указывает на то, что пользователь покидает диалоговое окно, не выполнив задачу. Это происходит, если пользователь нажимает кнопку "Назад" или касается экрана за пределами диалогового окна, или если вы явно вызываете cancel() для Dialog, например в ответ на нажатие кнопки "Отмена" в диалоговом окне.
Как показано в примере выше, вы можете реагировать на событие cancel, реализовав onCancel() в классе DialogFragment.