ti-enxame.com

Como descartar um DialogFragment ao pressionar fora da caixa de diálogo?

Eu estou usando um DialogFragment, e enquanto eu tenho definido com sucesso uma imagem para fechar (ou seja, ignorar) o diálogo quando pressionado, estou tendo dificuldade em encontrar a maneira de dispensar o diálogo quando o usuário clica em qualquer lugar fora dele, assim como funciona com diálogos normais. Eu pensei que haveria algum tipo de 

dialogFragment.setCanceledOnTouchOutside(true);

chamada, mas não vejo isso na documentação.

Isso é possível com DialogFragment? Ou estou procurando nos lugares errados? Eu tentei interceptar eventos de toque na atividade "pai", mas além de não ter nenhum evento de toque, não me pareceu certo.

67
sole
DialogFragment.getDialog().setCanceledOnTouchOutside(true);

Deve ser chamado em onCreateView (como Apurv Gupta apontou). 

153
Hamed
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       ...
       getDialog().setCanceledOnTouchOutside(true);
       ... 
       }
54
manuzhang
    /** The system calls this only when creating the layout in a dialog. */
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // The only reason you might override this method when using onCreateView() is
        // to modify any dialog characteristics. For example, the dialog includes a
        // title by default, but your custom layout might not need it. So here you can
        // remove the dialog title, but you must call the superclass to get the Dialog.
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCanceledOnTouchOutside(true);

        return dialog;
    }
19
Yakiv Mospan

Muitas respostas aqui, mas o aplicativo falha quando a caixa de diálogo é aberta. Escrever getDialog().setCanceledOnTouchOutside(true); dentro de onCreateView não funcionou e travou meu aplicativo.

(Eu estou usando AppCompatActivity como minha BaseActivity e Android.app.DialogFragment como meu fragmento).

O que funciona é uma das duas linhas a seguir:

getDialog (). setCanceledOnTouchOutside (true);

OR

this.getDialog (). setCanceledOnTouchOutside (true);

dentro onActivityCreated like

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimationZoom;
        //getDialog().getWindow().setDimAmount(0.85f);
        getDialog().setCanceledOnTouchOutside(true);//See here is the code
    }

O que não usar:

DialogFragment.getDialog (). SetCanceledOnTouchOutside (false);

lança o seguinte erro

enter image description here

E escrever o código em onCreateView trava o App! Por favor, atualize a resposta se você encontrar algo errado.

4
sud007
DialogFragment.getDialog().setCanceledOnTouchOutside(false);

Estava errando. Eu tive o mesmo problema. Isso funciona bem para Java e Mono para Android Mono será:

this.getDialog().SetCanceledOnTouchOutside(false);
1
Eugene Bosikov

Eu recomendaria usar minha solução somente depois de experimentar as soluções acima. Eu descrevi minha solução aqui . Apenas para breve, estou verificando os limites de toque de DialogFragment.getView (). Quando os pontos de contato estão fora do DialogFragment, estou descartando a caixa de diálogo.

0
Swaroop
            Dialog.SetCanceledOnTouchOutside(true);

Trabalhou para mim
Meu Código

class dlgRegister : DialogFragment
        {
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
            {
    ....
    ....
    }
    public override void OnActivityCreated(Bundle savedInstanceState)
            {
                Dialog.Window.RequestFeature(WindowFeatures.NoTitle);
                Dialog.SetCanceledOnTouchOutside(true);
                base.OnActivityCreated(savedInstanceState);
                Dialog.Window.Attributes.WindowAnimations =    Resource.Style.dialog_animation;
            }
    }
0
sham