2011-12-23 12 views
39

Planeo usar el patrón de IU de acciones rápidas en mi aplicación. Android Quick Actions UI Pattern. La ventana de acción rápida necesita una vista dinámica a la cual apegarse.Android: Obtener vista Referencia a un elemento de menú

quickAction.show(View pivotView); 

Tengo la intención de utilizar la acción rápida para el elemento del menú, puedo obtener acceso al elemento que se hace clic. Pero el problema es que necesito hacer referencia a una vista desde el elemento del menú para poder pasarlo a la acción rápida.

¿Cómo puedo obtener una referencia a una vista en el elemento del menú que está seleccionado?

+0

http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/ has utilizado este enlace .. –

+0

@NikhilreddyGujjula link is not working. –

+0

hace mucho tiempo que lo he probado, me ha funcionado, pero no tengo código para mí, sry .. –

Respuesta

76

Puede lograr esto proporcionando su elemento de menú con una propiedad actionViewClass en xml y luego podrá obtener la vista dinámica que desee. El código sería algo como esto

<item 
    android:id="@+id/menu_find" 
    android:showAsAction="ifRoom" 
    android:actionViewClass="android.widget.ImageButton" 
    /> 

En sus OnCreateOptionsMenu hacer 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; 
} 
+0

¡Muchas gracias! Tuve un problema extraño donde el visor encontraría un spiner en la barra de acciones cuando estaba en Android 4.1 pero en 4.2 simplemente devolvió nulo, esto lo solucionó. – PSIXO

+0

setOnMenuItemClickListener me será útil, en caso de que desee realizar una operación directa con el elemento de menú – AnkitRox

+11

use la aplicación: actionViewClass si usa una biblioteca reciente. (res-auto) –

28

vieja pregunta, pero me encontré con algunos problemas con el atributo actionViewClass. Para cualquiera que se encuentre con esto más tarde ...

Llamar a findViewById(R.id.mnu_item) en onOptionsItemSelected devolverá un ancla View.

QuickActions en el MenuItems no son un buen diseño, pero descubrí que son la forma más sencilla de implementar submenús con fondos personalizados.

+0

Supongo que tendrá que hacer clic en 'menuItem' al menos una vez antes de poder obtener el ancla 'view' de 'menuItem'. – Leebeedev

+0

Derecha, la llamada 'findViewById()' tendría que hacerse en tiempo de ejecución – loadedion

+0

Gracias @ASH respuesta falló si ponemos actionViewClass. Esto está funcionando bien. – iabhi

1

Una actualización para cualquier persona que desee encontrar el elemento de vista de menú por otros motivos (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... 
      } 
     } 
    } 
} 
1

en la clase de actividad principal, es mejor anular el método onOptionsItemSelected (...); debe ser algo como a continuación:

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 
} 
1

finde unas vistas referencias de los elementos del menú que tenemos que 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; 
} 
0

, usted puede obtener referencia al elemento de menú como este:

MenuItem btnFavorites = menu.findItem(R.id.action_favorite); 

Y luego haga lo que quiera con él. P.ej. cambiar su icono como este:

btnFavorites.setIcon(R.drawable.ic_favorite_false); 
1

Dentro de la onOptionsItemSelected simplemente obtener la vista mediante el uso del ello.

Ver menuItemView = findViewById (R.id.action_sort);

ahora puede utilizar esta vista según su requerimiento.

Cuestiones relacionadas