Отклонить DialogFragment (не Dialog) на TouchOutside - PullRequest
19 голосов
/ 05 января 2012

Я перебрал все ответы об отклонении Dialog onTouchOutside , однако я использую DialogFragment в своем приложении.Как можно добиться отклонения DialogFragment , когда пользователь щелкает за пределами области DialogFragment .

Я изучил исходный код Dialog * для 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

В дополнение к этому я рассмотрел состояние приложения с помощью ierarchyviewer и, насколько я понимаю, яможет видеть только область диалога, а не ее внешнюю часть (я имею в виду оставшуюся часть экрана после DialogFragment ).

Можете ли вы предложить способРеализация этого setCanceledOnTouchOutside для DialogFragment и, если возможно, с примером кода?

Ответы [ 5 ]

34 голосов
/ 14 февраля 2012

Ответ довольно прост:

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.

11 голосов
/ 13 декабря 2013

В большинстве случаев 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);
}
4 голосов
/ 22 ноября 2014

Почему бы просто не переопределить onCreateDialog и просто установить его там.Таким образом, вам не нужно постоянно проверять наличие нуля при вызове getDialog().

 @Override
 public Dialog onCreateDialog(Bundle savedInstanceState) {
     Dialog d =  super.onCreateDialog(savedInstanceState);
     d.setCanceledOnTouchOutside(false);
     return d;
 }
0 голосов
/ 20 января 2015

Я ответил на другой вопрос, но этот ответ больше подходит для этой проблемы, Мое решение .Просто для краткости, я просто реализовал onTouch() из DialogFragment getView() и проверил границы касания.

0 голосов
/ 06 сентября 2013

Я читал: http://developer.android.com/reference/android/app/DialogFragment.html

В нем говорится: «Управление диалогом (решение о том, когда показывать, скрывать, отклонять его) должно осуществляться здесь через API, а не с прямыми вызовами в диалоге.. "

...