Как мне запустить событие, когда щелчок происходит за пределами диалогового окна
Я хотел бы знать, как решить проблему, которую у меня есть.
У меня есть диалоговое окно, которое появляется в действии. Диалог не охватывает весь экран, поэтому кнопки из активности все еще отображаются. Я могу легко закрыть диалоговое окно, когда есть касание вне границ диалога с помощью dialog.setCanceledOnTouchOutside(true);
Однако то, что я хочу сделать, - это запустить событие, если клик находится за пределами границ диалогового окна (например, если кто-то касается кнопки основного действия, он должен закрыть диалоговое окно и одновременно запустить это событие).
Ответы
Ответ 1
Это работает для меня,
Window window = dialog.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
dialog.show();
Смотрите http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_NOT_TOUCH_MODAL
Ответ 2
Когда dialog.setCanceledOnTouchOutside(true);
, вы просто переопределяете onCancel()
следующим образом:
dialog.setOnCancelListener(
new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
//When you touch outside of dialog bounds,
//the dialog gets canceled and this method executes.
}
}
);
Введите код внутри метода onCancel()
, чтобы он запускался при отмене диалога.
Ответ 3
Вы можете использовать OnCancelListener для запуска события, когда щелчок происходит вне диалогового окна:
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
yourFunction();
}
});
Ответ 4
Если вы находитесь в пользовательском диалоговом классе и хотите перехватить событие "click outside" - переопределите cancel(). Если вы хотите перехватить событие "диалог закрыт" - переопределите dismiss(). Вставьте логику ДО super.dismiss(). Пример Kotlin:
override fun dismiss() {
Utils.hideKeyboard(mContext, window)
super.dismiss()
}