studio para menus inflar example ejemplos desplegable bar android android-layout menuitem layout-inflater actionview

para - menus en android ejemplos



¿Qué debería pasar para la raíz al inflar un diseño para usar en ActionView de un elemento de menú? (3)

Tengo un ImageView que adjunto a un MenuItem como su ActionView (el elemento aparece en la 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 que Lint me grite:

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

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

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

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

Esto parece funcionar ¿Alguien puede confirmar o negar si esto es lo que se debe hacer?


Por lo general, desea pasar lo que sea (subclase de ViewGroup) a la que va a agregar actionView para inflar. para volver a ActionView desde la llamada de inflado y no al principal, querrá agregar un tercer parámetro, falso, para que no agregue la vista inflada al principal.

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)

Aquí hay un buen tutorial que hace las cosas un poco diferente. Especifica 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 siempre esté usando el mismo diseño. Si vas por esa ruta, podrías obtener el ActionView haciendo

ImageView actionView = menu.findItem(R.id.whatever).getActionView();


Simplemente lo haría así:

menuItem.setActionView(R.layout.action_view_layout);

Deje que Android infle la vista por usted.

Si necesita hacer algunos cambios adicionales en esta llamada ImageView

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

Actualizar

Para atender 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 ha visto esto. también explica muy bien el inflador de diseño.

Hay 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 que está inflando el recurso para adjuntar. Cuando el tercer parámetro está presente, gobierna si la vista inflada se une o no a la raíz suministrada después del inflado.

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

Muchos desarrolladores consideran que este comportamiento significa que la forma correcta de desactivar el archivo adjunto en la inflación es pasar nulo como raíz; en muchos casos, ni siquiera se da cuenta de que existe la versión de tres parámetros de inflate ().

doubleencore.com/2013/05/layout-inflation-as-intended