android android-3.0-honeycomb contextual-action-bar

android - ¿Cómo invocar el comportamiento tipo ContextMenu de ActionBar?



android-3.0-honeycomb contextual-action-bar (3)

Sí, tampoco pude encontrarlo, tuve que preguntar en Google I | O.

Utilice startActionMode() . Aquí está una de sus muestras que lo demuestra. Necesito hacer más trabajo en esta área yo mismo.

En Android 3.0, cuando selecciona texto, por ejemplo, la barra de acción cambia a un modo similar a ContextMenu, que le permite realizar acciones con el texto seleccionado: copiar / compartir / etc, y aparece un botón "Listo" en el lado izquierdo para permitir al usuario salir de este modo.

¿Cómo puedo cambiar la barra de acción a este modo en mi aplicación (con mis elementos de menú, por supuesto)? Simplemente no pude encontrar esto en los documentos.



Para usar la nueva barra de acción contextual , consulte " Habilitar el modo de acción contextual para vistas individuales ". Afirma:

Si desea invocar el modo de acción contextual solo cuando el usuario selecciona vistas específicas, debe:

  1. Implementar la interfaz ActionMode.Callback . En sus métodos de devolución de llamada, puede especificar las acciones para la barra de acción contextual, responder a los eventos de clic en los elementos de acción y manejar otros eventos del ciclo de vida para el modo de acción.
  2. Llame a startActionMode() cuando desee mostrar la barra (como cuando el usuario hace clic en la vista).

Por ejemplo:

  1. Implementar la interfaz ActionMode.Callback :

    private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { // Called when the action mode is created; startActionMode() was called @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Inflate a menu resource providing context menu items MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); return true; } // Called each time the action mode is shown. Always called after onCreateActionMode, but // may be called multiple times if the mode is invalidated. @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; // Return false if nothing is done } // Called when the user selects a contextual menu item @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.menu_share: shareCurrentItem(); mode.finish(); // Action picked, so close the CAB return true; default: return false; } } // Called when the user exits the action mode @Override public void onDestroyActionMode(ActionMode mode) { mActionMode = null; } };

    Observe que estas devoluciones de llamada de evento son casi exactamente las mismas que las devoluciones de llamada para el menú de opciones, excepto que cada una de ellas también pasa el objeto ActionMode asociado con el evento. Puede usar ActionMode API de ActionMode para realizar varios cambios en el CAB, como revisar el título y el subtítulo con setTitle() y setSubtitle() (útil para indicar cuántos elementos están seleccionados).

    También mActionMode cuenta que la muestra anterior establece la variable mActionMode nula cuando se destruye el modo de acción. En el siguiente paso, verá cómo se inicializa y cómo puede ser útil guardar la variable miembro en su actividad o fragmento.

  2. Llame a startActionMode() para habilitar el modo de acción contextual cuando sea apropiado, como en respuesta a un clic largo en una View :

    someView.setOnLongClickListener(new View.OnLongClickListener() { // Called when the user long-clicks on someView public boolean onLongClick(View view) { if (mActionMode != null) { return false; } // Start the CAB using the ActionMode.Callback defined above mActionMode = getActivity().startActionMode(mActionModeCallback); view.setSelected(true); return true; } });

    Cuando llama a startActionMode() , el sistema devuelve el ActionMode creado. Al guardar esto en una variable miembro, puede realizar cambios en la barra de acción contextual en respuesta a otros eventos. En el ejemplo anterior, ActionMode se utiliza para garantizar que la instancia de ActionMode no se ActionMode crear si ya está activa, verificando si el miembro es nulo antes de iniciar el modo de acción.

Habilitar acciones contextuales por lotes en un ListView o GridView

Si tiene una colección de elementos en un ListView o GridView (u otra extensión de AbsListView ) y desea permitir que los usuarios realicen acciones por lotes, debe:

Por ejemplo:

ListView listView = getListView(); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listView.setMultiChoiceModeListener(new MultiChoiceModeListener() { @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { // Here you can do something when items are selected/de-selected, // such as update the title in the CAB } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { // Respond to clicks on the actions in the CAB switch (item.getItemId()) { case R.id.menu_delete: deleteSelectedItems(); mode.finish(); // Action picked, so close the CAB return true; default: return false; } } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Inflate the menu for the CAB MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.context, menu); return true; } @Override public void onDestroyActionMode(ActionMode mode) { // Here you can make any necessary updates to the activity when // the CAB is removed. By default, selected items are deselected/unchecked. } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { // Here you can perform updates to the CAB due to // an invalidate() request return false; } });

Eso es. Ahora, cuando el usuario selecciona un elemento con un clic prolongado, el sistema llama al método onCreateActionMode() y muestra la barra de acción contextual con las acciones especificadas. Mientras la barra de acción contextual está visible, los usuarios pueden seleccionar elementos adicionales.

En algunos casos en los que las acciones contextuales proporcionan elementos de acción comunes, es posible que desee agregar una casilla de verificación o un elemento de IU similar que permita a los usuarios seleccionar elementos, ya que es posible que no detecten el comportamiento de pulsación prolongada. Cuando un usuario selecciona la casilla de verificación, puede invocar el modo de acción contextual configurando el elemento de lista respectivo en el estado marcado con setItemChecked() .