Advertencia “Evite pasar nulo como la raíz de la vista” al inflar la vista para que la use AlertDialog

5 minutos de lectura

Recibo la advertencia de pelusa, Avoid passing null as the view root al inflar las vistas con null como parentme gusta:

LayoutInflater.from(context).inflate(R.layout.dialog_edit, null);

Sin embargo, la vista debe usarse como el contenido de un AlertDialogusando setView en AlertDialog.Builderpor lo que no sé qué se debe pasar como el parent.

¿Qué piensas de la parent debe ser en este caso?

  • Pase falso en lugar de nulo. mira esto

    – Señor Tonto

    16/10/2014 a las 12:54

  • Intente darle un diseño principal en lugar de nulo y luego no use setView.

    – Haresh Chhelana

    16/10/2014 a las 13:09

  • Suprimo la advertencia de pelusa para el método. Todavía no he visto una buena razón por la que no debería pasar null.

    – 323go

    16/10/2014 a las 14:09

  • Entiendo el problema del diseño dependiendo de la vista principal, pero eso realmente no se aplica a un AlertDialog que esencialmente flota por encima de la jerarquía de vistas de la actividad. Por eso puedes pasar null. Hay una razón por la que puedes suprimir la pelusa. Se supone que Lint te da advertencias sobre problemas que a menudo se pasan por alto; en este caso, es la invocación correcta.

    – 323go

    17 de octubre de 2014 a las 1:50

  • @ashutiwari4 Estoy aprendiendo cosas nuevas todos los días… hermoso mundo :I

    – Raúl

    24 de abril de 2017 a las 6:51


Use este código para inflar la vista de diálogo sin una advertencia:

View.inflate(context, R.layout.dialog_edit, null);

  • @MarianPaździoch Porque no provoca una advertencia. 🙂 Por supuesto, eso plantea la pregunta de por qué el código de pelusa trata View.inflate y LayoutInflator.inflate diferentemente. No he visto una respuesta definitiva. Puede estar relacionado con por qué hay dos formas aparentemente equivalentes de inflar la misma vista, para lo cual tampoco he visto una razón.

    –Eduardo Brey

    9 de febrero de 2015 a las 13:37

  • Esto está mal. Solo suprime la advertencia, pero el problema sigue ahí. Leer posiblemobile.com/2013/05/layout-inflation-as-intended para una mejor solución.

    – jcsahnwaldt Reincorporar a Monica

    18 mayo 2015 a las 15:40

  • @JonaChristopherSahnwaldt ¿Podría dar más detalles? El artículo dice que AlertDialog debe tener un padre nulo porque no tiene una vista raíz. Para mí, parece reforzar que la advertencia tiene sentido para las vistas fuera de un cuadro de diálogo, pero no se aplica a una vista de cuadro de diálogo.

    –Eduardo Brey

    18 mayo 2015 a las 15:46

  • @EdwardBrey Tienes razón: no leí el artículo a fondo. En este caso particular, está bien usar cualquiera View.inflate(...null) o @SuppressLint. En general, LayoutInflater.from(...).inflate(..., parent, false) es mejor. ¡Gracias por señalar esto!

    – jcsahnwaldt Reincorporar a Monica

    18 mayo 2015 a las 15:54

  • @Bevor That Evite pasar la pregunta nula se trata de casos en los que tiene un padre. Esta pregunta es sobre AlertDialog, que no proporciona elementos primarios para la vista que se infla. Al inflar la vista raíz de un AlertDialog, pasar nulo es correcto. Lint no tiene en cuenta este contexto particular, por lo que la advertencia que da si usa la función que toma parent un falso positivo, no una indicación de algo propenso a errores. Por eso es válido en este caso usar la función que no toma parent y no activa ninguna advertencia.

    –Eduardo Brey

    8 de diciembre de 2018 a las 13:01


avatar de usuario
emersso

La historia corta es que cuando estás inflando una vista para un diálogo, parent debe ser nulo, ya que no se conoce en Ver tiempo de inflación. En este caso, tienes tres soluciones básicas para evitar el aviso:

  1. Suprimir la advertencia mediante @Suppress
  2. Inflar la vista usando View’s método de inflado. Esto es solo un envoltorio alrededor de un LayoutInflater, y en su mayoría solo ofusca el problema.
  3. Inflar la vista usando LayoutInflater’s método completo: inflate(int resource, ViewGroup root, boolean attachToRoot). Establecer attachToRoot a false.Esto le dice al inflador que el padre no está disponible. En versiones anteriores de Android Lint, esto eliminaba la advertencia. Este ya no es el caso en las versiones posteriores a 1.0 de Android Studio.

Verificar http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ para una gran discusión de este tema, específicamente la sección “Cada regla tiene una excepción” al final.

Deberías usar AlertDialog.Builder.setView(your_layout_id)por lo que no es necesario inflarlo.

Usar AlertDialog.findViewById(your_view_id) después de crear el diálogo.

Usar (AlertDialog) dialogInterface para obtener el dialog dentro de OnClickListener y entonces dialog.findViewById(your_view_id).

  • ¡Este es el camino a seguir! Simplemente cree el cuadro de diálogo y luego encuentre su vista.

    – joe1806772

    28 de marzo de 2017 a las 23:02

  • Esta es una buena forma de hacerlo, sin embargo recuerda que este método fue agregado en API 21

    – Nicolás Carrasco-Stevenson

    11 de abril de 2018 a las 7:07

  • ¿Qué sucede si debemos almacenar este diseño inflado en alguna variable? Por ejemplo, escribí una clase A en el que está el método onCreateDialog. En este último, escribí como dijiste alert_dialog_builder.setView(R.layout.edit_account_dialog);. Pero tengo que almacenar este diseño inflado en el Avariable de atributo llamada the_inflated_layout_of_the_dialog.

    – JarsOfJam-Programador

    26 de febrero de 2019 a las 21:56

avatar de usuario
SVL Narasimham

Casting null as ViewGroup resolvió la advertencia:

View dialogView = li.inflate(R.layout.input_layout,(ViewGroup)null);

dónde li es el LayoutInflater's objeto.

No es necesario especificar un parent para un diálogo.

Suprime esto usando @SuppressLint("InflateParams") en la parte superior de la anulación.

Cuando realmente no tienes nada parent (por ejemplo, creando una vista para AlertDialog), no te queda más remedio que pasar null. Así que haz esto para evitar la advertencia:

final ViewGroup nullParent = null;
convertView = infalInflater.inflate(R.layout.list_item, nullParent);

avatar de usuario
dharma

De acuerdo a https://developer.android.com/guide/topics/ui/dialogs

Inflar y establecer el diseño para el cuadro de diálogo
Pase nulo como la vista principal porque va en el diseño del cuadro de diálogo

por lo tanto, para crear AlertDialog, uso @SuppressLint("InflateParams")

LayoutInflater inflater = requireActivity().getLayoutInflater();
@SuppressLint("InflateParams")
View view = inflater.inflate(R.layout.layout_dialog, null);
builder.setView(view);

¿Ha sido útil esta solución?