2012-03-02 14 views
25

Al tratar de seguir las Pautas de diseño de Android, me encuentro con un pequeño dilema.Barra de acción contextual de compatibilidad con Android

Quiero tener una lista de elementos que puedo presionar durante mucho tiempo (selección múltiple), y luego realizar acciones masivas en ellos.

Las Pautas de diseño sugieren el uso de la barra de acción contextual para esto, y suena perfectamente como lo que tenía en mente. El problema es que estoy tratando de mantener la compatibilidad con API 7 (debido a que mi teléfono es 2.3.3 actualmente).

estoy usando ActionBarSherlock para conseguir otras cosas actionbar, pero me parece que no puede encontrar la manera de conseguir que cualquiera fuego hasta una barra de acciones contextuales, ni he descubierto la manera de añadir botones arbitrariamente el ActionBar en ABS. Veo que puede hacer pestañas, así que tal vez esa es la respuesta, pero como estoy tratando de permitir la selección múltiple, no quiero tener el menú contextual modal normal.

+0

Hola, verificaste el código fuente de muestra, también hay ejemplos de botones para agregar, botones contextuales ..etc https://github.com/JakeWharton/ActionBarSherlock/tree/master/samples/demos –

+2

Sí, miré las clases en esa carpeta, no vi los ejemplos de los que estás hablando. Los únicos ejemplos que vi de agregar cosas se hacen en el paso de creación de OptionsMenu, pero estoy buscando hacerlo en respuesta a un largo clic en un elemento (lógicamente una cosa contextual). ¿Puede decirme específicamente en qué archivo lo vio? – Paul

+0

Así es como lo hice funcionar http://stackoverflow.com/questions/14737519/implementing-multi-selection-and-contextual-actionmode-in-actionbarsherlock/14737520#14737520 –

Respuesta

16

Configuración actionbar contextual es la misma que la configuración de los elementos 'normales' actionbar por lo que el XML está preocupado. This example in the developer's guide explains it all.

Para utilizar ActionBarSherlock, reemplazar los predeterminados android-devoluciones de llamada para las devoluciones de llamada ActionBarSherlock-editado (por ejemplo, en lugar de Android.View.ActionMode, utilice com.actionbarsherlock.view.ActionMode).

+1

ese espacio de nombre no existe, por lo que yo sé. – Paul

+2

¿Está usando v4.0 de ActionBarSherlock? Se retiró de beta la semana pasada. – Reinier

+0

Actualizar a 4.0 agregará los espacios de nombres que se está perdiendo. – Reinier

1

Para una muestra de clic largo, consulte los enlaces a continuación. El primero es el código de Java requerido para la muestra. Y el segundo es cómo definir el diseño;

+1

Eso no tiene nada que ver con mi pregunta. Ese ejemplo es cómo mostrar un menú contextual de un fragmento. Estoy intentando replicar la barra de acciones contextuales de las API más actuales. – Paul

0

voy a responder a la segunda parte de su pregunta. Aquí hay un ejemplo de cómo agregar cualquier instancia Ver (botón en el código de abajo) actionbar con la biblioteca ActionBarSherlock:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

     refreshButton = (RotatingButton) LayoutInflater.from(this).inflate(R.layout.actionbar_customview_refresh, null); 
     refreshButton.setOnClickListener(refreshButtonListener); 

     MenuItem item = menu.add(0, android.R.id.copy, 0, getString(R.string.actionbar_refresh)); 
     item.setActionView(refreshButton); 
     item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.main_activity_action_bar, menu); 
} 
+0

Sí, ya lo he hecho antes, pero eso hace que se muestre en la barra de acciones todo el tiempo para esa actividad. Lo que intento hacer es mostrar el botón solo después de seleccionar los elementos en la lista, y actualizar después de que se seleccione cada elemento. – Paul

0

Tenía el mismo problema. Fue resuelto cuando encontré this link. Básicamente, debe crear una clase de devolución de llamada que implemente ActionMode.Callback. En esta clase, inflas la barra de acción con tu barra de acción contextual. En cada selección (o clic largo), inicia la devolución de llamada utilizando el método startActionMode. Ver el enlace de un código de trabajo =]

EDIT: También hay un ejemplo en muestras de Sherlock bajo /samples/demos/src/com/actionbarsherlock/sample/demos/ActionModes.java

22

Ésta es una respuesta tardía, pero creo que ayudaría a las personas atrapadas.

la apertura de la barra de acción contextual es en realidad bastante simple, en cualquier punto de su actividad sólo hay que llamar:

startActionMode(mActionModeCallback); 

Si no está en su actividad principal, como en fragmentos, se puede obtener una de referencia con

getSherlockActivity().startActionMode(mActionModeCallback); 

y esta es la devolución de llamada

private ActionMode.Callback mActionModeCallback = new ActionMode.Callback(){ 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      MenuInflater inflater = mode.getMenuInflater(); 
      inflater.inflate(R.menu.actionbar_context_menu, menu); 
      return true; 
     } 

    @Override 
    public void onDestroyActionMode(ActionMode mode) { 

    } 

    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.menu_item1: 
       return true; 
      case R.id.menu_item2: 
       //close the action mode 
       //mode.finish(); 
       return true; 
      default: 
       mode.finish(); 
       return false; 
     } 
    } 
}; 

el XML es un menú sencillo como el actionbar uno:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 

<item android:id="@+id/menu_item1" 
     android:icon="@drawable/ic_item1" 
     android:title="@string/ITEM1" 
     android:showAsAction="always|withText" /> 

<item android:id="@+id/menu_item2" 
     android:icon="@drawable/ic_item2" 
     android:title="@string/ITEM2" 
     android:showAsAction="always|withText" /> 

+1

¡Guau guapa! ¡Has pasado un par de horas con esto! buen trabajo – Francois

2

ActionBarSherlock tiene su propia implementación de ActionMode, pero tendrá manualy controll su lifesycle, me escribió una tutorial sobre esto.

Cuestiones relacionadas