Диалоговые окна в Android

Добавлено: 12/03/2017 23:16 |  Обновлено: 18/12/2017 08:04 |  Добавил: nick |  Просмотры: 5967 Комментарии: 0
Вводная часть
Из этого материала вы узнаете, как вызвать диалоговое окно в вашем приложении и обработать событие нажатия кнопки в окне из активности. Для вывода диалогового окна поверх активности используется класс android.support.v4.app.DialogFragment из библиотеки совместимости.
Этот материал основан на материале «RecyclerView и CardView в Android», опубликованном ранее. Поэтому прежде чем преступать к работе, желательно ознакомиться с ним.

Как это работает можно увидеть в моем приложении «Секретные карточки». Страница приложения в Google Play. ×
Продолжим работу со ScrollingActivity из материала «RecyclerView и CardView в Android». У нас есть круглая кнопка, которую мы еще никак не задействовали. Используем её для вызова диалогового окна. Код обработчика события для кнопки следующий:
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
	//
    }
});
В методе onClick() нужно добавить код для вывода диалогового окна, с использованием DialogFragment.
DialogFragment newFragment = new AddDialogFragment();
newFragment.show(getSupportFragmentManager(), "addDialog");
В коде мы создаем новый объект класса AddDialogFragment, который нам еще нужно создать. В этом классе будет размещен весь необходимый код по работе с диалоговым окном.

Заготовка для класса AddDialogFragment следующая:
import android.support.v4.app.DialogFragment;

public class AddDialogFragment extends DialogFragment {
}
Добавим в класс метод onCreateDialog(), в котором, для создания диалогового окна, используем android.support.v7.app.AlertDialog из библиотеки совместимости.
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();
    builder.setView(inflater.inflate(R.layout.dialog_add, null))
            .setPositiveButton("ДОБАВИТЬ", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                    //
                }
            });
    return builder.create();
}
В диалоговом окне у нас одна кнопка с названием «ДОБАВИТЬ». Также подключена собственная разметка с двумя полями ввода через метод setView().

Далее нам нужно связать активность с диалоговым окном. Для этого создадим интерфейс с именем AddDialogListener с методом onDialogPositiveClick(). Активность реализует этот интерфейс и так образом сможет обработать нажатие кнопки в диалоговом окне. Интерфейс должен выглядеть следующим образом:
public interface AddDialogListener {
    void onDialogPositiveClick(DialogFragment dialog);
}
Вернёмся в активность. Объявление класса теперь будет выглядеть следующим образом:
public class ScrollingActivity extends AppCompatActivity implements AddDialogFragment.AddDialogListener {
    //
}
Реализуем в активности метод onDialogPositiveClick() интерфейса AddDialogListener.
@Override
public void onDialogPositiveClick(DialogFragment dialog) {
    String buttonName = getResources().getString(R.string.dialog_positive_button);
    Snackbar mSnackbar = Snackbar.make(rv, "Этот Snackbar появляется после нажатия кнопки \""+buttonName+"\" в диалоговом окне", Snackbar.LENGTH_INDEFINITE)
                    .setAction("Action", null);

    View snackbarView = mSnackbar.getView();
    snackbarView.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorMyGreenDark));
    mSnackbar.show();
}
Возвращаемся к файлу фрагмента.

Как мы знаем, в момент присоединения фрагмента к активности вызывается метод onAttach(). Этот метод можно использовать для регистрации активности во фрагменте.
@Override
public void onAttach(Context context) {
    super.onAttach(context);

    if (context instanceof Activity){
        activity = (Activity) context;
    }

    try {
        mListener = (AddDialogListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement AddDialogListener");
    }
}
Как мы видим, ссылка на активность присваивается свойству mListener. AddDialogListener mListener; Теперь можно дополнить метод onCreateDialog(), который мы рассматривали ранее:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();
    builder.setView(inflater.inflate(R.layout.dialog_add, null))
            .setPositiveButton(R.string.dialog_positive_button, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                    mListener.onDialogPositiveClick(AddDialogFragment.this);
                }
            });
    return builder.create();
}
Теперь можно запустить проект и посмотреть результат проделанной работы.

Оставьте свой комментарий

Комментариев нет