2011-05-16 18 views
5

He registrado varios botones para el menú contextualget view id from oncontextitemselected

¿cómo sé en qué botón se hizo clic para que aparezca el menú?

a continuación es el pseudocódigo que voy a utilizar. Necesito hacer algo relacionado con el botón al que se hizo clic (tengo que declarar algunos botones más), ¿cómo sé que el menú contextual se activa desde qué botón hacer clic?

EDIT: Creo que no me di cuenta, quería saber en qué botón se hizo clic para que aparezca el menú. No se hace clic en el elemento del menú. De todos modos, tengo una solución que añadiré muy pronto.

gracias

private static final int SEND_AS_TEXT = Menu.FIRST; 
private static final int SEND_AS_IMAGE = Menu.FIRST + 1; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     sendAllBtn = (Button)findViewById(R.id.sendAllBtn); 
     sendAllBtn.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     registerForContextMenu(v); 
     openContextMenu(v); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     // TODO Auto-generated method stub 
     AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
     switch(item.getItemId()){ 
     case SEND_AS_TEXT: 
      //do sth related to the button clicked 
      break; 

     } 
     return super.onContextItemSelected(item); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenuInfo menuInfo) { 
     // TODO Auto-generated method stub 
     super.onCreateContextMenu(menu, v, menuInfo); 
     menu.add(Menu.NONE, SEND_AS_TEXT, SEND_AS_TEXT, "Send As Text"); 
     menu.add(Menu.NONE, SEND_AS_IMAGE, SEND_AS_IMAGE, "Send As Image"); 
    } 
+0

pegar su código que se ha utilizado –

+0

lo siento, estaba navegando este sitio móvil, mientras que ahora detalles añadido:. D –

Respuesta

11

Ok, muchas gracias por la ayuda de los otros que aclarar mis dudas sobre la GetItemID ya que devuelve el ID que Asigné el elemento del menú. En mi caso, quería saber en qué botón se hizo clic antes de crear el menú contextual.

Para hacer esto, simplemente creo una variable larga para almacenar el botón que se hizo clic. El identificador del botón se puede obtener como en el siguiente:

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
     ContextMenuInfo menuInfo) { 
    // TODO Auto-generated method stub 
    super.onCreateContextMenu(menu, v, menuInfo); 
    menu.setHeaderTitle("Send As.."); 
    menu.add(Menu.NONE, SEND_AS_TEXT, SEND_AS_TEXT, "Send As Text"); 
    menu.add(Menu.NONE, SEND_AS_IMAGE, SEND_AS_IMAGE, "Send As Image"); 
    btnId = v.getId(); //this is where I get the id of my clicked button 
} 

y posteriormente sólo tendrá que hacer referencia a este btnId a hacer lo que quiera.

0
@Override 
public boolean onContextItemSelected(MenuItem item) { 
    item.getItemId(); 
    return super.onContextItemSelected(item); 
} 
+0

estoy supongo que no es lo que quería, getItemId devuelve el id del elemento de menú que asigné al crear el menú contextual –

0

probar este ...

@Override 
public boolean onContextItemSelected(MenuItem item) 
{ 
    if(item.getItemId()==SEND_AS_TEXT) 
    { 
     //code for send text 
    } 
    else if(item.getItemId()==SEND_AS_IMAGE) 
    { 
     //code for send image 
    } 
    return super.onContextItemSelected(item); 
} 
+0

Supongo que no es lo que quería, getItemId devuelve el id del elemento de menú que asigné al crear el menú contextual, quiero saber en qué botón se hizo clic antes de crear el menú contextual. De todos modos, tengo la solución que publicaré más tarde. –

+0

poner una variable local y establecer el valor en OnClick como si (v == bt) {variable = bt} ...... y obtener ese valor en onContextItemSelected (elemento del elemento de menú) –

1

Si usted está buscando para la Identificación de los datos subyacentes (proporcionado por el adaptador getItemId(int)), a continuación, sólo tiene que añadir las siguientes líneas en el onContextItemSelected método:

final AdapterView.AdapterContextMenuInfo info = 
    (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
final long datasId = info.id // get datas id 
4

creo que tiene más sentido usar el ID de la vista específica. Supongamos que tiene un ListView poblado de elementos que contienen sus datos, pero entre algunos de los elementos ha creado separadores/encabezados. No desea que los separadores manejen clics/clics largos.

En algunos casos, está totalmente bien referirse a "posición" o MenuInfo.id, pero dependiendo de la estructura de datos, es posible que necesite más control.

Lo que puede hacer es establecer identificaciones para los elementos/vistas dentro de su ListView (view.setId (x), donde x representa la ID/posición para su estructura/objeto de datos. Luego, al crear un ContextMenu y manejarlo selecciones dentro de ella haga lo siguiente para leer el ID de salida:.

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 

    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; 
    int id = info.targetView.getId(); 

    // now you can refer to your data with the correct ID of yours 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
    int id = info.targetView.getId(); 

    // now you can refer to your data with the correct ID of yours 
} 
+0

+1 para tomar el tiempo para responder la pregunta ¡Y con un código de ejemplo también! Sigan con el buen trabajo! – scraimer

+0

int id = info.position; trabajó para mi. – msj121

+0

info.targetView.getId() en onContextItemSelected return -1, no estoy seguro de por qué? – neobie

Cuestiones relacionadas