Como descartar um DialogFragment ao pressionar fora da caixa de diálogo?
Pergunta
Estou usando um DialogFragment
e, embora tenha definido com êxito uma imagem para fechar (ou seja, dispensar) a caixa de diálogo quando pressionada, estou tendo dificuldade em encontrar a maneira de dispensar a caixa de diálogo quando o usuário clica em qualquer lugar fora dela, apenascomo funciona com diálogos normais.Eu pensei que haveria algum tipo de
dialogFragment.setCanceledOnTouchOutside(true);
ligue, mas não vejo isso na documentação.
Isso é possível com DialogFragment
?Ou estou procurando nos lugares errados?Tentei interceptar eventos de toque na atividade 'pai', mas, além de não receber nenhum evento de toque, não me pareceu certo.
Solução
DialogFragment.getDialog().setCanceledOnTouchOutside(true);
Deve ser chamado em onCreateView
(como Apurv Gupta apontou).
Outras dicas
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
getDialog().setCanceledOnTouchOutside(true);
...
}
/** 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;
}
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.
(Estou usando AppCompatActivity
como minha BaseActivity e android.app.DialogFragment
como meu Fragment).
O que funciona é uma das seguintes linhas:
getDialog (). setCanceledOnTouchOutside (true);
OU
this.getDialog (). setCanceledOnTouchOutside (true);
dentro do onActivityCreated
como
@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
E escrever o código em onCreateView
trava o aplicativo!
Atualize a resposta se encontrar algo errado.
DialogFragment.getDialog().setCanceledOnTouchOutside(false);
Foi um erro de digitação.Eu tive o mesmo problema.Isso funciona bem para Java e Mono para Android Mono será:
this.getDialog().SetCanceledOnTouchOutside(false);
Eu recomendaria usar minha solução somente depois de experimentar as soluções acima.Descrevi minha solução aqui .Para resumir, estou verificando os limites de toque de DialogFragment.getView ().Quando os pontos de contato estão fora do DialogFragment, estou dispensando o Dialog.
Dialog.SetCanceledOnTouchOutside(true);
Funcionou 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;
}
}