ventana studio personalizado mensaje emergente ejemplo dialogo custom cuadro confirmación con botones android alertdialog android-alertdialog layout-inflater

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)

  1. 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")

  2. 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:

  1. Suprima la advertencia usando un @Suppress
  2. 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.
  3. Infle la vista usando el método completo de LayoutInflater: inflate(int resource, ViewGroup root, boolean attachToRoot) . Establezca attachToRoot en false . Esto le indica 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 la 1.0 de Android Studio.

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