¿Qué debo pasar por la raíz al inflar una presentación para utilizarla en ActionView de MenuItem?

Tengo un ImageView que adjunto a un MenuItem como su ActionView (el artículo aparece en el ActionBar ). El diseño de esta vista proviene de XML. Lo estoy inflando así:

 ImageView actionView = (ImageView) layoutInflater.inflate( R.layout.action_view_layout, null); 

Esto parece funcionar bien. Sin embargo; Pasar null para root en la llamada a inflate() hace Lint gritarme:

Evite pasar null como raíz de vista (necesita resolver los parámetros de diseño en el elemento raíz del diseño hinchado)

Aparentemente puedo manejar sin una raíz en mi caso específico, pero prefiero que el código sea lo más correcto posible. El problema es, no estoy seguro de qué View debe utilizar como la raíz aquí. Esta respuesta dice que debe ser "el widget que rodea los objetos de vista que desea inflar." Pero, ¿qué significa eso aquí? ¿El de la barra de acción? ¿La actividad? ¿Algo más enteramente?


Actualización: leer las respuestas me ha hecho sospechar que lo correcto es:

  1. Obtener la View ActionBar correspondiente al MenuItem
  2. Obtener su raíz
  3. Transmitir la raíz a un grupo de ViewGroup
  4. Pase el resultado al inflador

Esto parece funcionar. ¿Puede alguien confirmar o negar si esto es lo que debe hacerse?

Simplemente lo haría así:

 menuItem.setActionView(R.layout.action_view_layout); 

Deja que Android infle la vista para ti.

Si necesita realizar algunos cambios adicionales en esta llamada de ImageView

 ImageView imageView = (ImageView) menuItem.getActionView(); 

Actualizar

Con el fin de atender a su curiosidad. Eso es lo que la gente de Google hace bajo el capó:

 public MenuItem setActionView(int resId) { final Context context = mMenu.getContext(); final LayoutInflater inflater = LayoutInflater.from(context); setActionView(inflater.inflate(resId, new LinearLayout(context), false)); return this; } 

Usted tiene mirada en esto. Explica bien el Inflador de diseño también.

Existen dos versiones utilizables del método inflate() para una aplicación estándar:

 inflate(int resource, ViewGroup root) inflate(int resource, ViewGroup root, boolean attachToRoot) 

El primer parámetro apunta al recurso de diseño que desea inflar. El segundo parámetro es la vista raíz de la jerarquía en la que está inflando el recurso al que desea adjuntar. Cuando el tercer parámetro está presente, gobierna si la vista inflado está o no unida a la raíz suministrada después del inflado.

Son estos dos últimos parámetros los que pueden causar un poco de confusión. Con la versión de dos parámetros de este método, LayoutInflater automáticamente intentará adjuntar la vista inflada a la raíz suministrada. Sin embargo, el marco tiene una comprobación en lugar de que si pasa nulo para la raíz omite este intento de evitar un bloqueo de aplicación.

Muchos desarrolladores toman este comportamiento para significar que la forma correcta de deshabilitar el apego sobre la inflación es pasar null como root; En muchos casos ni siquiera darse cuenta de que existe la versión de tres parámetros de inflar ().

Más sobre la inflación de diseño

Por lo general, quiere pasar lo que sea (subclase ViewGroup) que va a agregar actionView a in para inflar. Con el fin de obtener actionView volver de la inflar llamada y no el padre que desea añadir un tercer parámetro, falso, por lo que no se agrega la vista inflada a los padres.

 ImageView actionView = (ImageView)layoutInflater.inflate(R.layout.action_view_layout, parent, false); // .. do whatever you like with actionView and then add it to it's parent menuItem.addActionView(actionView) 

Hay un tutorial bastante bueno aquí que va sobre las cosas un poco diferente. Está especificando action_view_layout como parte de menu.xml con algo como:

 android:actionLayout="@layout/action_view_layout" 

Eso también puede funcionar para usted, siempre que esté utilizando siempre el mismo diseño. Si usted va esa ruta usted podría conseguir el ActionView haciendo

 ImageView actionView = menu.findItem(R.id.whatever).getActionView(); 
  • Android - Cómo cambiar dinámicamente el texto del elemento de menú fuera de onOptionsItemsSelected o onCreateOptionsMenu
  • ¿Es posible acallar (no sólo deshabilitar) un MenuItem en Android?
  • Android: color de fondo cuando se pulsa el elemento de menú
  • Elemento de menú de opciones personalizadas de Android
  • OnOptionsItemSelected () no se llama al hacer clic en el elemento de menú que tiene un conjunto actionLayout en él
  • Android: Obtener una vista Referencia a un elemento de menú
  • Agregar dinámicamente elemento de acción en la barra de acción
  • ¿Cómo puedo establecer la visibilidad de un elemento de ActionBar en fragmento diferente
  • Cómo cambiar la posición de los elementos del menú en la barra de acciones
  • Tableta de Gmail como elementos de Actionbar
  • Cómo agregar elementos de submenú a ActionBar acción en código?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.