SetOnCancelListener и setOnDismissListener не вызываются для AlertDialog для нажатия кнопки "Назад" или касания снаружи
При
- Коснитесь области диалога
- Нажмите кнопку "Назад"
Ожидаю onDismiss
(Или onCancel
). Однако оба они не называются. Могу ли я узнать, есть ли что-то, что мне не хватает? Из AlertDialog setOnDismissListener не работает, я думал, что onCancel
будет вызываться, когда я нажимаю кнопку. Но это не работает для меня. Могу ли я узнать, что я пропустил?
public class RateAppDialogFragment extends SherlockDialogFragment {
public static RateAppDialogFragment newInstance() {
RateAppDialogFragment rateAppDialogFragment = new RateAppDialogFragment();
return rateAppDialogFragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Get the layout inflater
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.rate_app_dialog_fragment, null);
Utils.setCustomTypeFace(view, Utils.ROBOTO_LIGHT_TYPE_FACE);
final AlertDialog dialog = new AlertDialog.Builder(this.getSherlockActivity())
.setTitle("Love JStock?")
.setView(view)
// Add action buttons
.setPositiveButton("Rate 5 stars \u2605", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
Utils.showShortToast("Rate");
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Utils.showShortToast("No");
}
})
.setNeutralButton("Later", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Utils.showShortToast("Later");
}
})
.create();
dialog.setCanceledOnTouchOutside(true);
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
Utils.showShortToast("Back button pressed?");
}
});
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
// TODO Auto-generated method stub
Utils.showShortToast("Back button pressed?");
}
});
return dialog;
}
}
FragmentManager fm = fragmentActivity.getSupportFragmentManager();
if (fm.findFragmentByTag(RATE_APP_DIALOG_FRAGMENT) != null) {
return;
}
RateAppDialogFragment rateAppDialogFragment = RateAppDialogFragment.newInstance();
rateAppDialogFragment.show(fm, RATE_APP_DIALOG_FRAGMENT);
Ответы
Ответ 1
Проблема возникает, когда вы используете DialogFragment
для отображения Dialog
В соответствии с http://developer.android.com/reference/android/app/DialogFragment.html решение должно переопределить onCancel
в DialogFragment
Также обратите внимание на http://developer.android.com/reference/android/app/DialogFragment.html#onCreateDialog(android.os.Bundle)
Примечание. DialogFragment имеет собственный Dialog.setOnCancelListener и Обратные вызовы Dialog.setOnDismissListener. Вы не должны устанавливать их самостоятельно. Чтобы узнать об этих событиях, переопределите onCancel (DialogInterface) и onDismiss (DialogInterface).
// This is DialogFragment, not Dialog
@Override
public void onCancel(DialogInterface dialog) {
}
Ответ 2
Вы не установили backPressed
ключевое событие
dialog.setOnKeyListener(new Dialog.OnKeyListener() {
@Override
public boolean onKey(DialogInterface arg0, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) {
finish();
}
return true;
}
});
Ответ 3
Если вы используете AlertDialog
, см.
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// dialog dismiss without button press
}
});
и dialog.setCanceledOnTouchOutside(true)
(спасибо @LeosLiterak)
Ответ 4
вы должны прочитать эту тему: Как отклонить диалог с нажатием на внешнее диалоговое окно?
Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true);
Ответ 5
в диалоговом окне "Диалог", переопределить
@Override
public void onStop() {
super.onStop();
if (mListener != null) {
// do something here
}
}