Для создания своих диалоговых окон используется компонент 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.
При этом, как можно увидеть на скриншоте, кнопки и заголовок с иконкой не входят в разметку.