Вместо использования alerttdialog, как описано выше, рассмотрите возможность использования DialogFragment.
Ваш класс AlertDialog будет выглядеть следующим образом:
public class AlertDialogFragment extends DialogFragment {
/** Create a new instance of the Dialog Fragment which will display an alert dialog. The alert
* dialog is always cancelable.
* @param title The title of the alert dialog.
* @param message The message.
* @return An alert dialog.
*/
public static AlertDialogFragment newInstance(String title, String message) {
AlertDialogFragment frag = new AlertDialogFragment();
Bundle args = new Bundle();
args.putString("title", title);
args.putString("msg", message);
frag.setArguments(args);
return frag;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
String title = getArguments().getString("title");
String message = getArguments().getString("msg");
View v = inflater.inflate(R.layout.fragment_alert_dialog, container, false);
setCancelable(false);
if (getDialog() != null && getDialog().getWindow() != null) {
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().setCanceledOnTouchOutside(false);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
TextView titleArea = v.findViewById(R.id.title);
titleArea.setText(title);
TextView messageArea = v.findViewById(R.id.message);
messageArea.setText(message);
Button okButton = v.findViewById(R.id.button);
okButton.setText(R.string.ok);
okButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
return v;
}
Чтобы отобразить диалоговое окно, вы можете сделать следующее:
AlertDialogFragment dialog = (AlertDialogFragment) fragmentManager.findFragmentByTag(tag);
if (dialog == null) {
dialog = UpdatingProgressDialogFragment.newInstance(message);
dialog.show(fragmentManager, tag);
}
, где 'tag' будет идентифицирующимСтрока для этого диалога, например. «ALERT».
Примечание. «Frag_alert_dialog» - это просто файл макета, определяющий, как должен выглядеть диалог предупреждения.
Второе примечание. Дополнительным преимуществом использования фрагмента является то, что диалоговое окно не закрывается при повороте устройства.
Ответ на нажатия кнопок: Извините, я пропустил эту часть. Чтобы ответить на нажатие кнопки, вы можете определить интерфейс для вашего фрагмента диалога. Например,
/** Should be implemented by all users of this dialog. */
public interface DialogUser {
/**
* Will be called when the YES option was selected.
* @param tag The Dialog Tag, for when there is more than one dialog in the activity.
**/
void onDialogYesSelected(String tag);
/**
* Will be called when the NO option was selected.
* @param tag The Dialog Tag, for when there is more than one dialog in the activity.
**/
void onDialogNoSelected(String tag);
}
Затем, когда пользователь нажимает одну из кнопок, вы можете выполнить:
yesButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getActivity() instanceof DialogUser) {
((YesNoDialogUser) getActivity()).onDialogYesSelected(mTag);
} else {
Log.w("DIALOG", "activity does not implement interface");
}
dismiss();
}
});
Операция, вызывающая диалоговое окно, должна затем расширить DialogUser и определить, что должно произойти с этимспусковой крючок. Вы также можете передать в свой диалог специальную строку, которая используется в onDialogYesSelected (), чтобы вы знали, какой диалог вызвал этот конкретный вызов onDialogYesSelected () - например, если у вашей активности был диалог для Wi-Fi и другой для GPS, токаждый из них даст свой тег onDialogYesSelected ()