Подтвердить что ты не робот

Отклонить 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 и, если возможно, с образцом кода?

4b9b3361

Ответ 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() и проверил сенсорные границы.