La propiedad DialogFragment setCancelable no funciona

101

Estoy trabajando en una aplicación de Android y estoy usando un DialogFragment para mostrar un diálogo y quiero hacer que DialogFragment no se pueda cancelar. Hice que la propiedad cancelable del cuadro de diálogo sea falsa, pero aún así no afecta.

Por favor, mire mi código y sugiera una solución.

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;
    }
 }
Arun
fuente
28
en lugar de getDialog (). setCancelable (false); deberías llamar a setCancelable (false);
Blackbelt
Si hace clic fuera del límite del cuadro de diálogo, también debe descartarse.
Usman Kurd
¿Estás probando un sándwich de helado? Por favor, consulte el enlace mencionado fantasypublishings.com/morePhpHelp/…
Remmyabhavan

Respuestas:

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;
}

en lugar de getDialog().setCancelable(false);tener que usar directamentesetCancelable(false);

entonces la respuesta actualizada será así

@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;
}
Cinta negra
fuente
Ese es un consejo realmente increíble, GRACIAS. Me pregunto por qué, con say dialog.getWindow (). RequestFeature (-) tienes que "incluir el diálogo" en getWindow.
Fattie
7
No es una propina. Un fragmento está envolviendo su diálogo, es normal que tenga que lidiar con el fragmento en lugar del diálogo en sí;)
andrea.rinaldi
1
En caso de que no anule onCreateView, también se puede llamar a setCancelable (false) desde el cuadro de diálogo público onCreateDialog (Bundle SavedInstanceState)
user2924714
2
No funciona para mi. El diálogo aún se descarta al hacer clic en el botón Atrás.
Pinkesh Darji
@Blackbelt Tengo un caso de uso similar, pero en mi caso, un toque fuera del diálogo no descarta el diálogo. Estoy usando un DatePicker dentro de DialogFragment. ¿Qué usaría para "R.layout.dialog_test" en su respuesta anterior? Mi pregunta completa aparece aquí: stackoverflow.com/questions/59825258/…
AJW
51

Utilice el siguiente fragmento

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

y si desea deshabilitar el cuadro de diálogo de toque exterior, use la siguiente línea de código

DialogFragment.getDialog().setCanceledOnTouchOutside(true);
Usman Kurd
fuente
1
Esta debería ser la respuesta aceptada, ya que es aplicable tanto a los fragmentos de diálogo de alerta de vainilla como a los fragmentos de diálogo personalizados.
Ganesh Mohan
29

En caso de que use el generador de alertas (y probablemente en todos los casos envuelva el diálogo dentro de un DialogFragment) para ayudar a construir su diálogo, no use getDialog (). SetCancelable (false) o Dialog.setCancelable (false) porque no va a trabajo. Use setCancelable (falso) como se muestra en el código a continuación, como se menciona en la documentación oficial de Android:

public void setCancelable (boolean cancelable)

Agregado en API nivel 11 Controle si el cuadro de diálogo mostrado es cancelable. Use esto en lugar de llamar directamente a Dialog.setCancelable (boolean), porque DialogFragment necesita cambiar su comportamiento basándose en esto ".

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
fuente
Sí, probé la solución anterior, incluso la marcada, pero no funciona para mí, esa respuesta es nueva, así que necesito tiempo para ser votado, gracias de todos modos.
Xenione
Bueno, esto es cierto, incluso si creo que este comportamiento del lado de Android es bastante extraño, ya que usa explícitamente, por ejemplo, AlertDialog.Builder para construir su diálogo, pensaría que esos atributos anulan las subclases. ¿Pero quizás me esté perdiendo algo aquí?
Robert
Creo que el comportamiento del diálogo después de estar envuelto en un fragmento de diálogo ya no responde al AlertDialog o al menos al bigining. Creo que todo pasa por fragmentDialog en su lugar.
Xenione
¡Gracias! Estuve usando alert.setCancelable (false) todo este tiempo y no pude entender por qué no funcionaría.
Aldo
0

Solución simple en DialogFragment

Usado

dialog.setCanceledOnTouchOutside(false)
Mirza Adil
fuente