A propriedade DialogFragment setCancelable não funciona


101

Estou trabalhando em um aplicativo Android e usando um DialogFragment para mostrar uma caixa de diálogo e quero tornar esse DialogFragment não cancelável. Eu tornei a propriedade cancelável da caixa de diálogo em false, mas ainda não está afetando.

Por favor, olhe em meu código e sugira uma solução.

public class DialogTest extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        return super.onCreateDialog(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_test, container, true);
        getDialog().requestWindowFeature(STYLE_NO_TITLE);
        getDialog().setCancelable(false);

        return view;
    }
 }

28
em vez de getDialog (). setCancelable (false); você deve chamar setCancelable (false);
Blackbelt

se você clicar fora dos limites da caixa de diálogo, ela também deve ser desmembrada?
Usman Curdo

Você está experimentando um sanduíche de sorvete? Consulte o link mencionado em fantasypublishings.com/morePhpHelp/…
Remmyabhavan

Respostas:


238
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.dialog_test, container, true);
    getDialog().requestWindowFeature(STYLE_NO_TITLE);
    getDialog().setCancelable(false);

    return view;
}

em vez de getDialog().setCancelable(false);você tem que usar diretamentesetCancelable(false);

então a resposta atualizada será assim

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.dialog_test, container, true);
    getDialog().requestWindowFeature(STYLE_NO_TITLE);
    setCancelable(false);

    return view;
}

Essa é uma dica realmente incrível, OBRIGADO. Eu me pergunto por que, com dizer dialog.getWindow (). RequestFeature (-), você tem que "incluir a caixa de diálogo" no getWindow?
Fattie

7
Não é uma dica. Um fragmento está envolvendo sua caixa de diálogo, é normal que você tenha que lidar com o fragmento em vez da própria caixa de diálogo;)
andrea.rinaldi

1
Caso você não substitua onCreateView, o setCancelable (false) também pode ser chamado a partir da caixa de diálogo pública onCreateDialog (Bundle savedInstanceState)
user2924714

2
Não está funcionando para mim. A caixa de diálogo ainda é descartada com o clique do botão Voltar.
Pinkesh Darji

@Blackbelt Tenho um caso de uso semelhante, mas, no meu caso, um toque fora da caixa de diálogo não a está descartando. Estou usando um DatePicker no DialogFragment. O que eu usaria para "R.layout.dialog_test" em sua resposta acima? Minha pergunta completa está listada aqui: stackoverflow.com/questions/59825258/…
AJW

51

Use o seguinte snippet

void showDialog() {
    DialogFragment newFragment = MyAlertDialogFragment.newInstance(
            R.string..alert_dialog_two_buttons_title);
    newFragment.setCancelable(false);
    newFragment.show(getFragmentManager(), "dialog");
}

e se você deseja desativar a caixa de diálogo de toque externo, use a seguinte linha de código

DialogFragment.getDialog().setCanceledOnTouchOutside(true);

1
Esta deve ser a resposta aceita, pois é aplicável para fragmentos de diálogo de alerta vanilla e fragmentos de diálogo personalizado.
Ganesh Mohan de

29

No caso de você usar o construtor de alerta (e provavelmente em todos os casos você envolve o diálogo dentro de um DialogFragment) para ajudar a construir seu diálogo, por favor, não use getDialog (). SetCancelable (false) ou Dialog.setCancelable (false) porque não vai trabalhos. Use setCancelable (false) conforme mostrado no código abaixo, conforme mencionado na documentação oficial do Android:

public void setCancelable (boolean cancelable)

Adicionado no nível 11 da API para controlar se a caixa de diálogo exibida pode ser cancelada. Use isto em vez de chamar diretamente Dialog.setCancelable (boolean), porque DialogFragment precisa mudar seu comportamento com base nisso. "

ref: http://developer.android.com/reference/android/app/DialogFragment.html#setCancelable(boolean)

public class MyDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.dialog_layout, null, false);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
                .setTitle("in case you want use a title").setView(view);

        AlertDialog alert = builder.create();
        // alert.setCancelable(false); <-- dont' use that instead use bellow approach
        setCancelable(false); <-  press back button not cancel dialog, this one works fine
        alert.setCanceledOnTouchOutside(false); <- to cancel outside touch

        return alert;
}

Sim, eu tento a solução acima, mesmo a marcada, mas não funciona para mim, essa resposta é nova, então preciso de tempo para ser votado positivamente. Obrigado de qualquer maneira.
Xenione

Bem, isso é verdade, mesmo que eu ache que esse comportamento do lado do Android seja bastante estranho, já que você usa explicitamente, por exemplo, AlertDialog.Builder para construir seu diálogo, você pensaria que esses atributos substituem as subclasses. Mas talvez eu esteja faltando alguma coisa aqui?
Robert

Acho que o comportamento do diálogo depois de ser enrolado em um fragmento de diálogo não responde mais ao AlertDialog ou pelo menos no bigining. Acho que tudo passa por fragmentDialog em vez disso.
Xenione

Obrigado! Eu estava usando alert.setCancelable (false) todo esse tempo e não conseguia entender por que não funcionava.
Aldo

0

Solução Simples em DialogFragment

Usava

dialog.setCanceledOnTouchOutside(false)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.