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;
    }
 }
Uma corrida
fonte
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;
}
Cinto preto
fonte
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);
Usman Kurd
fonte
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;
}
Xenione
fonte
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)
Mirza Adil
fonte