Простой фрагмент диалога "да/нет"
Я хотел бы сделать dialog fragment
, который спрашивает: "Вы уверены?" с ответом "да/нет".
Я просмотрел документацию, и это действительно многословно, переходя повсюду, объясняя, как создавать расширенные диалоговые окна, но не имеет интактного кода для создания простое диалоговое окно "hello world". В большинстве руководств используется система устаревших диалоговых окон. Официальный блог кажется излишне сложным и трудным для понимания.
Итак, какой самый простой способ создать и отобразить действительно базовый диалог оповещений? Бонусные баллы, если он использует библиотеку поддержки.
Ответы
Ответ 1
Диалоговое окно - это просто фрагмент, который обертывает диалог. Вы можете поместить туда какой-либо диалог, создав и вернув диалоговое окно в методе onCreateDialog() диалогового окна "Диалог".
Вот пример DialogFragment:
class MyDialogFragment extends DialogFragment{
Context mContext;
public MyDialogFragment() {
mContext = getActivity();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mContext);
alertDialogBuilder.setTitle("Really?");
alertDialogBuilder.setMessage("Are you sure?");
//null should be your on click listener
alertDialogBuilder.setPositiveButton("OK", null);
alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
return alertDialogBuilder.create();
}
}
Чтобы создать диалог:
new MyDialogFragment().show(getFragmentManager(), "MyDialog");
И отклонить диалог где-нибудь:
((MyDialogFragment)getFragmentManager().findFragmentByTag("MyDialog")).getDialog().dismiss();
Весь этот код будет отлично работать с библиотекой поддержки, просто изменив импорт для использования классов библиотеки поддержки.
Ответ 2
Итак, какой самый простой способ создать и отобразить действительно базовый диалог оповещения? Бонусные баллы, если он использует библиотеку поддержки.
Просто создайте DialogFragment
(SDK или вспомогательную библиотеку) и переопределите его метод onCreateDialog
чтобы вернуть AlertDialog
с нужным текстом и установленными на нем кнопками:
public static class SimpleDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setMessage("Are you sure?")
.setPositiveButton("Ok", null)
.setNegativeButton("No way", null)
.create();
}
}
Чтобы сделать что-то, когда пользователь использует одну из кнопок, вам нужно будет предоставить экземпляр DialogInterface.OnClickListener
вместо null
ссылок из моего кода.
Ответ 3
Для тех, кто программирует с Kotlin и Anko, теперь вы можете делать диалоги в 4 строки кода:
alert("Order", "Do you want to order this item?") {
positiveButton("Yes") { processAnOrder() }
negativeButton("No") { }
}.show()
Ответ 4
из-за жизненного цикла Activity/Fragment Подход @athor и @lugsprog может завершиться неудачно,
более элегантный способ состоит в том, чтобы ** получить контекст активности из метода onAttach и сохранить его как слабую ссылку ** (и попытаться избежать конструктора по умолчанию в диалоговом окне "Диалог", чтобы передать любой аргумент аргументам использования диалога) следующим образом:
public class NotReadyDialogFragment extends DialogFragment {
public static String DIALOG_ARGUMENTS = "not_ready_dialog_fragment_arguments";
private WeakReference<Context> _contextRef;
public NotReadyDialogFragment() {
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
/** example pulling of arguments */
Bundle bundle = getArguments();
if (bundle!=null) {
bundle.get(DIALOG_ARGUMENTS);
}
//
// Caution !!!
// check we can use contex - by call to isAttached
// or by checking stored weak reference value itself is not null
// or stored in context -> example allowCreateDialog()
// - then for example you could throw illegal state exception or return null
//
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(_contextRef.get());
alertDialogBuilder.setMessage("...");
alertDialogBuilder.setNegativeButton("Przerwij", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
return alertDialogBuilder.create();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
_contextRef = new WeakReference<Context>(activity);
}
boolean allowCreateDialog() {
return _contextRef !== null
&& _contextRef.get() != null;
}
EDIT:
& Амп; если вы хотите отменить диалог, то:
- попробуйте его
- проверить, существует ли он
- проверьте, показывает ли он
- смещать
что-то вроде этого:
NotReadyDialogFragment dialog = ((NotReadyDialogFragment) getActivity().getFragmentManager().findFragmentByTag("MyDialogTag"));
if (dialog != null) {
Dialog df = dialog.getDialog();
if (df != null && df.isShowing()) {
df.dismiss();
}
}
EDIT2:, и если вы хотите установить диалог как не отмененный u, вы должны изменить инструкцию onCreatweDialog следующим образом:
/** convert builder to dialog */
AlertDialog alert = alertDialogBuilder.create();
/** disable cancel outside touch */
alert.setCanceledOnTouchOutside(false);
/** disable cancel on press back button */
setCancelable(false);
return alert;