2010-09-15 8 views
21
lv.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       TextView text = (TextView) view.findViewById(R.id.btitle); 
       registerForContextMenu(text); 
       view.showContextMenu(); 
       } 
      }); 
     } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     TextView text = (TextView) v.findViewById(R.id.btitle); 
     CharSequence itemTitle = text.getText(); 
     menu.setHeaderTitle(itemTitle); 

     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.context_menu, menu); 

    } 

Hola,Android ContextMenu abierta con poco tiempo de clic + clic elemento pase detalles

Estoy intentando abrir un contextMenu con poco tiempo de elemento clic. He logrado hacerlo solo si agrego registerForContextMenu(getListView()); en algún lado, pero esto también desencadena contextMenu en clics largos (que no deseo que ocurra).

  • Probamos view.showContextMenu() pero no hace nada menos que añado el registerForContextMenu(getListView());.
  • Probamos el registro del artículo se ha hecho clic primero y luego llamar a la showContextMenu() pero no hacer nada, así ...

También, quiero obtener la imagen del artículo se ha hecho clic + texto para que pueda utilizarlos en el Menú de contexto.

¡Apreciar la ayuda!

Respuesta

4

Solución:

@Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.context_menu, menu); 

     AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo; 
     long itemID = info.position; 
     menu.setHeaderTitle("lior" + itemID); 
    } 

AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;

le da más detalles sobre la lista en la que se hace clic. Luego puede usar info.id, info.position y así sucesivamente para recuperar los detalles y usar las acciones (editar, eliminar ...).

+0

gracias por esto! Lo usé para construir sobre cómo hacer clic en el elemento desde un Adaptador personalizado. –

0

Creo que si agrega un OnLongClickListener a la vista, debería poder evitar que muestre el menú contextual con un clic prolongado.

En onItemClick el parámetro view es la vista del elemento, por lo que debe ser capaz de obtener ImageViews o TextViews de que:

view.findById(R.id.my_image_view); 
+0

Hola Mayra, lo sé ... pero por alguna razón no está obteniendo esto. no force close .. solo muestra los detalles del primer elemento de la lista. –

+0

"no está obteniendo esto"? –

+0

public void onCreateContextMenu (menú ContextMenu, Ver v, ContextMenuInfo menuInfo) { \t super.onCreateContextMenu (menú, v, menuInfo); \t TextView text = (TextView) v.findViewById (R.id.btitle); \t menu.setHeaderTitle (text.getText()); ........ } Obtiene solo el primer título del elemento y no el elemento en el que se hizo clic. –

59

pude abrir un menú contextual de clic de botón con el siguiente código:

public void onButtonClickEvent(View sender) 
{ 
    registerForContextMenu(sender); 
    openContextMenu(sender); 
    unregisterForContextMenu(sender); 
} 

acaba de establecer la propiedad OnClick del botón para onButtonClickEvent. Un clic prolongado no activará el menú contextual, ya que no está registrado justo después de que se muestre.

+1

Esto funcionó para mí también, solo por el problema del clic corto. – iCantSeeSharp

+1

@konrad ... Excelente ... ¡¡¡Gran ayuda !! :) – Noman

+0

+1 - Lo necesitaba como parte de hacer clic en una fila de la tabla, hice el trabajo, ¡muchas gracias! – AgentKnopf

38

En cuanto a la apertura de un menú contextual de un corto clic:

Las otras soluciones publicadas aquí no funcionó para mí porque yo estaba usando un ListFragment. Sin embargo, la siguiente solución parece funcionar bastante bien tanto para un ListFragment y una ListActivity (o simplemente cualquier vista de lista de edad en general):

public void onListItemClick(ListView l, View v, int position, long id){ 
    l.showContextMenuForChild(v); 
} 

Es mucho más simple y elegante. De hecho, así es como la clase ListView inicia el menú contextual con un clic prolongado.

+4

Si bien esta es la solución que estaba buscando (¡+1!), No parece ajustarse a lo que el OP estaba buscando, ya que el menú contextual aún se mostrará con un clic prolongado. – Blumer

+1

@Blumer Sí, lo sé:/Pero dado que el título de la pregunta no hace mención a esa advertencia, decidí publicar mi solución para las personas como usted y yo que se toparían con esta pregunta sin tener ese requisito . –

+1

+1 Al usar 'l.showContextMenuForChild (v)' en lugar de 'openContextMenu (l)' al invocar 'item.getMenuInfo()' en 'onContextItemSelected' se obtendrá un' AdapterContextMenuInfo' válido. – tidbeck

0

Mi Solución:

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     {    
      mListView.showContextMenuForChild(view); 
     } 
    }); 
1

En mi caso tuve BaseAdapter e implementé clic en el botón para cada elemento ListView (en el método getView):

ImageButton menuBtn = (ImageButton) convertView.findViewById(R.id.itemListMenu); 
menuBtn.setOnClickListener(new android.view.View.OnClickListener() { 
    public void onClick(View v) { 
     parent.showContextMenuForChild(v); 
    } 
}); 
Cuestiones relacionadas