android - studio - Advertencia "Evite pasar nulo como raíz de vista" al inflar la vista para que AlertDialog la use
progress dialog personalizado android (9)
-
AlertDialog es, hasta donde yo sé, el único caso en el que puede usar con seguridad nulo en lugar de una vista principal. En este caso, puede suprimir la advertencia utilizando:
@SuppressLint ("InflateParams")
-
En general, nunca debe usar SupressLint o una de las soluciones mencionadas en las otras respuestas para deshacerse de la advertencia. La vista principal es necesaria para evaluar los parámetros de diseño que se declaran en el elemento raíz de la vista que se está inflando. Eso significa que si usa nulo en lugar de la vista principal, todos los parámetros de diseño en el elemento raíz serán ignorados y reemplazados por parámetros de diseño predeterminados. La mayoría de las veces estará bien, pero en algunos casos resultará en un error realmente difícil de encontrar.
Recibo la advertencia de pelusa,
Avoid passing null as the view root
al inflar vistas con
null
como
parent
, como:
LayoutInflater.from(context).inflate(R.layout.dialog_edit, null);
Sin embargo, la vista se debe usar como contenido de un
AlertDialog
, usando
setView
en
AlertDialog.Builder
, por lo que no sé qué se debe pasar como
parent
.
¿Qué crees que debería ser el
parent
en este caso?
Cuando realmente no tiene ningún
parent
(por ejemplo, creando una vista para
AlertDialog
), no tiene otra opción que pasar
null
.
Haga esto para evitar advertencias:
final ViewGroup nullParent = null;
convertView = infalInflater.inflate(R.layout.list_item, nullParent);
De la documentación de
View.inflate()
, dice
Inflar una vista desde un recurso XML.
Este método de conveniencia envuelve la clase
LayoutInflater
, que proporciona una gama completa de opciones para ver la inflación.
@param context The Context object for your activity or application.
@param resource The resource ID to inflate
@param root A view group that will be the parent. Used to properly inflate the layout_* parameters.
Debe usar
AlertDialog.Builder.setView(your_layout_id)
, por lo que no necesita inflarlo.
Use
AlertDialog.findViewById(your_view_id)
después de crear el cuadro de diálogo.
Use
(AlertDialog) dialogInterface
para obtener el
dialog
dentro de
OnClickListener
y luego
dialog.findViewById(your_view_id)
.
En lugar de hacer
view = inflater.inflate(R.layout.list_item, null);
hacer
view = inflater.inflate(R.layout.list_item, parent, false);
Lo inflará con el padre dado, pero no lo adjuntará al padre.
Muchas gracias a Coeffect ( enlace a su publicación )
La historia corta es que cuando está inflando una vista para un diálogo, el
parent
debe ser nulo, ya que no se conoce en el tiempo de inflación de la vista.
En este caso, tiene tres soluciones básicas para evitar la advertencia:
- Suprima la advertencia usando un @Suppress
- Infle la vista usando el método de inflado de la vista. Esto es solo una envoltura alrededor de un LayoutInflater, y en su mayoría solo ofusca el problema.
-
Infle la vista usando el método completo de LayoutInflater:inflate(int resource, ViewGroup root, boolean attachToRoot)
.EstablezcaEn versiones anteriores de Android Lint, esto eliminaba la advertencia. Este ya no es el caso en las versiones posteriores a la 1.0 de Android Studio.attachToRoot
enfalse
. Esto le indica al inflador que el padre no está disponible.
Visite http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ para una gran discusión sobre este tema, específicamente la sección "Cada regla tiene una excepción" al final.
Lanzar nulo como ViewGroup resolvió la advertencia:
View dialogView = li.inflate(R.layout.input_layout,(ViewGroup)null);
donde
li
es el objeto
LayoutInflater''s
.
No necesita especificar un
parent
para un diálogo.
@SuppressLint("InflateParams")
esto usando
@SuppressLint("InflateParams")
en la parte superior de la anulación.
Use este código para inflar la vista de diálogo sin una advertencia:
View.inflate(context, R.layout.dialog_edit, null);