Для создания своих диалоговых окон используется компонент AlertDialog в связке с классом фрагмента DialogFragment. Рассмотрим их применение.
Вначале добавим в проект новый класс фрагмента, который назовем CustomDialogFragment:
package com.example.dialogsapp; import android.app.AlertDialog; import android.app.Dialog; import android.os.Bundle; import androidx.fragment.app.DialogFragment; import androidx.annotation.NonNull; public class CustomDialogFragment extends DialogFragment { @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder=new AlertDialog.Builder(getActivity()); return builder.setTitle("Диалоговое окно").setMessage("Для закрытия окна нажмите ОК").create(); } }
Класс фрагмента содержит всю стандартную функциональность фрагмента с его жизненным циклом, но при этом наследуется от класса DialogFragment, который добавляет ряд дополнительных функций. И для его создания мы можем использвоать два способа:
Переопределение метода onCreateDialog()
, который возвращает объект Dialog
.
Использование стандартного метода onCreateView()
.
Для создания диалогового окна в методе onCreateDialog()
применяется класс AlertDialog.Builder
. С помощью своих методов
он позволяет настроить отображение диалогового окна:
setTitle
: устанавливает заголовок окна
setView
: устанавливает разметку интерфейса окна
setIcon
: устанавливает иконку окна
setPositiveButton
: устанавливает кнопку подтверждения действия
setNeutralButton
: устанавливает "нейтральную" кнопку, действие которой может отличаться от действий подтверждения или отмены
setNegativeButton
: устанавливает кнопку отмены
setMessage
: устанавливает текст диалогового окна, но при использовании setView данный метод необязателен или может рассматриваться
в качестве альтернативы, если нам надо просто вывести сообщение.
create
: создает окно
В данном же случае диаговое кно просто выводит некоторое сообщение.
Для вызова этого диалогового окна в файле activity_main.xml определим кнопку:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Dialog" android:onClick="showDialog" app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toLeftOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
В коде MainActivity определим обработчик нажатия кнопки, который будет запускать диалоговое окно:
package com.example.dialogsapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; public class MainActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); setContentView(R.layout.activity_main); } public void showDialog(View v) { CustomDialogFragment dialog = new CustomDialogFragment(); dialog.show(getSupportFragmentManager(), "custom"); } }
Для вызова диалогового окна создается объект фрагмента CustomDialogFragment, затем у него вызывается метод show()
. В этот метод передается
менеджер фрагментов FragmentManager и строка - произвольный тег.
И поле нажатия на кнопку мы сможем ввести данные в диалоговое окно:
Теперь немного кастомизируем диалоговое окно:
public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder=new AlertDialog.Builder(getActivity()); return builder .setTitle("Диалоговое окно") .setIcon(android.R.drawable.ic_dialog_alert) .setMessage("Для закрытия окна нажмите ОК") .setPositiveButton("OK", null) .setNegativeButton("Отмена", null) .create(); }
Здесь добавляетcя иконка, которая в качестве изображения использует встроенный ресурс android.R.drawable.ic_dialog_alert
и устанавливаются
две кнопки. Для каждой кнопки можно установить текст и обработчик нажатия. В данном случае для обработчика нажатия передается null, то есть обработчик не установлен.
Теперь добавим в папку res/layout новый файл dialog.xml:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hello Android" app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
И изменим создание диалогового окна:
public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder=new AlertDialog.Builder(getActivity()); return builder .setTitle("Диалоговое окно") .setIcon(android.R.drawable.ic_dialog_alert) .setView(R.layout.dialog) .setPositiveButton("OK", null) .setNegativeButton("Отмена", null) .create(); }
Метод setView()
устанавливает в качестве интерфейса окна ранее добавленный ресурс layout dialog.xml.
При этом, как можно увидеть на скриншоте, кнопки и заголовок с иконкой не входят в разметку.