DialogFragment и создание диалоговых окон

Последнее обновление: 18.10.2021

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

И поле нажатия на кнопку мы сможем ввести данные в диалоговое окно:

DialogFragment и AlertDialog в Android и Java

Теперь немного кастомизируем диалоговое окно:

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();
}
Диалоговые окна в Android и Java

Здесь добавляет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.

Создание диалоговых окон в Android

При этом, как можно увидеть на скриншоте, кнопки и заголовок с иконкой не входят в разметку.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850