studio - Android: Obtener referencia de vista a un elemento de menú
programacion android pdf 2018 (7)
Dentro de onOptionsItemSelected simplemente obtenga la vista usando el id.
Ver menuItemView = findViewById (R.id.action_sort);
Ahora puede utilizar esta vista según su requerimiento.
Planeo usar acciones rápidas en la interfaz de usuario en mi aplicación. Android acciones rápidas patrón de interfaz de usuario . La ventana de acción rápida necesita una vista dinámica para mantenerla.
quickAction.show(View pivotView);
Tengo la intención de utilizar la acción rápida para el elemento del menú, puedo acceder al elemento en el que se hace clic. Pero el problema es que necesito hacer referencia a una vista del elemento del menú para poder pasarla a la acción rápida.
¿Cómo puedo obtener una referencia a una vista en el elemento de menú que está seleccionado?
Para obtener vistas de referencia de los elementos del menú necesitamos hacer esto,
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.section, menu);
new Handler().post(new Runnable() {
@Override
public void run() {
final View menuItemView = findViewById(R.id.action_preview);
// SOME OF YOUR TASK AFTER GETTING VIEW REFERENCE
}
});
return true;
}
Pregunta antigua, pero me encontré con algunos problemas con el atributo actionViewClass
. Para cualquier persona que se tope con esto más tarde ...
Llamar a findViewById(R.id.mnu_item)
en onOptionsItemSelected
devolverá un ancla de View
.
QuickActions
en los QuickActions
de QuickActions
no son un buen diseño, pero descubrí que son la forma más sencilla de implementar submenús con fondos personalizados.
Puede lograr esto proporcionando su elemento de menú con una propiedad actionViewClass en xml y luego podrá obtener la vista dinámica que desea. El código sería algo así.
<item
android:id="@+id/menu_find"
android:showAsAction="ifRoom"
android:actionViewClass="android.widget.ImageButton"
/>
En tu menú de OnCreateOptions haz esto
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu_search, menu);
locButton = (ImageButton) menu.findItem(R.id.menu_find).getActionView();
locButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
createPopup();
mQuickAction.show(v);
}
});
return true;
}
Puede obtener referencia a un elemento del menú como este:
MenuItem btnFavorites = menu.findItem(R.id.action_favorite);
Y luego haz lo que quieras con él. Por ejemplo, cambiar su icono como este:
btnFavorites.setIcon(R.drawable.ic_favorite_false);
en la clase de actividad principal, es mejor anular el método onOptionsItemSelected (...); Debería ser algo como el siguiente:
public boolean onOptionsItemSelected(MenuItem item) {
// the id is of type int
int someId = item.getItemId();
// can use an if() or switch() statement to check if id is selected
//a Toast message can be used to show item is selected
}
Una actualización para cualquier persona que quiera encontrar el elemento de vista de menú por otras razones (como yo quería).
Si tiene acceso y utiliza la barra de herramientas de AppCompat, hay una manera. No es la forma más eficiente, pero es la forma más fácil que he encontrado para acceder a la vista del elemento del menú.
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
// Find Menu
for (int toolbarChildIndex = 0; toolbarChildIndex < toolbar.getChildCount(); toolbarChildIndex++) {
View view = toolbar.getChildAt(toolbarChildIndex);
// Found Menu
if (view instanceof ActionMenuView) {
ActionMenuView menuView = (ActionMenuView) view;
// All menu items
for (int menuChildIndex = 0; menuChildIndex < menuView.getChildCount(); menuChildIndex++) {
ActionMenuItemView itemView = (ActionMenuItemView) menuView.getChildAt(menuChildIndex);
// Do something to itemView...
}
}
}
}