Отклонить DialogFragment (не Dialog) onTouchOutside
Я просмотрел все ответы об отключении диалога onTouchOutside, однако я использую DialogFragment в своем приложении. Как я могу добиться отклонения DialogFragment, когда пользователь щелкает за пределами области Диалоговое окно.
Я рассмотрел Диалог исходный код для setCanceledOnTouchOutside
public void setCanceledOnTouchOutside(boolean cancel) {
if (cancel && !mCancelable) {
mCancelable = true;
}
mCanceledOnTouchOutside = cancel;
}
Здесь может быть интересна другая функция, которая является isOutOfBounds
private boolean isOutOfBounds(MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
final int slop = ViewConfiguration.get(mContext).getScaledWindowTouchSlop();
final View decorView = getWindow().getDecorView();
return (x < -slop) || (y < -slop)
|| (x > (decorView.getWidth()+slop))
|| (y > (decorView.getHeight()+slop));
}
но я не мог понять, как использовать их для DialogFragment
В дополнение к этим я изучил состояние приложения с hierarchyviewer
и, насколько я понимаю, я могу видеть область диалога, а не его часть (я имею в виду оставшуюся часть экрана после DialogFragment).
Можете ли вы предложить способ реализации этого setCanceledOnTouchOutside для DialogFragment и, если возможно, с образцом кода?
Ответы
Ответ 1
Ответ довольно прост:
MyDialogFragment fragment = new MyDialogFragment(); // init in onCreate() or somewhere else
...
if ( fragment.getDialog() != null )
fragment.getDialog().setCanceledOnTouchOutside(true); // after fragment has already dialog, i. e. in onCreateView()
См. http://developer.android.com/reference/android/app/DialogFragment.html#setShowsDialog%28boolean%29 для получения дополнительной информации о диалогах в DialogFragments.
Ответ 2
В большинстве случаев getDialog() имеет значение null, так как вы не получите его сразу после создания нового экземпляра вашего диалога.
Как указано выше, onViewCreated
также не подходит для DialogFragment
, особенно при использовании android.support.v4.app.DialogFragment
.
Ниже показано, что оно находится на onCreateView
:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (getDialog() != null) {
getDialog().setCanceledOnTouchOutside(true);
}
return super.onCreateView(inflater, container, savedInstanceState);
}
Ответ 3
Почему бы просто не переопределить onCreateDialog
и просто установить его там. Таким образом, вам не нужно все время проверять значение null на вызове getDialog()
.
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog d = super.onCreateDialog(savedInstanceState);
d.setCanceledOnTouchOutside(false);
return d;
}
Ответ 4
Я читал: http://developer.android.com/reference/android/app/DialogFragment.html
В нем говорится: "Контроль диалога (выбор, когда показывать, скрывать, отклонять его) должен выполняться через API здесь, а не с прямыми вызовами в диалоговом окне".
Ответ 5
Я ответил на другой вопрос, но этот ответ более подходит для этой проблемы, Мое решение. Для краткого ознакомления здесь я просто выполнил onTouch()
DialogFragment
getView()
и проверил сенсорные границы.