2011-05-05 32 views
7

Disculpe la estúpida pregunta, pero ¿qué debo cambiar/agregar en ese código para mostrar el menú contextual haciendo clic breve en el elemento en la vista de lista?Menú contextual por clic corto

public class MyActivity extends ListActivity implements AdapterView.OnItemClickListener { 
    static final String[] COUNTRIES = new String[]{ 
      "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", 
      "Angola", "Anguilla", "Antarctica" 
    }; 

    /** 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, COUNTRIES)); 

     ListView lv = getListView(); 
     lv.setTextFilterEnabled(true); 

     lv.setOnItemClickListener(this); 
    } 


    public void onCreateContextMenu(ContextMenu menu, View v, 
            ContextMenu.ContextMenuInfo menuInfo) { 
     Log.e("sdklfjsdkljfl", " <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< "); 
     menu.setHeaderTitle("HELLO"); 

    } 

    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
     Log.e("kjhasjkdhkas", "sdkhjkhskaf"); 
     this.openContextMenu(view); 
    } 
} 

Respuesta

5

es necesario llamar a registerForContextMenu en la vista.

Editado para añadir llamada a setLongClickable (falso)

public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
    registerForContextMenu(view); 
    view.setLongClickable(false); // undo setting of this flag in registerForContextMenu 
    this.openContextMenu(view); 
} 

Usted también tendrá que agregar realmente elementos de menú o el menú no se mostrará tampoco. Solo configurar el encabezado no es suficiente.

NOTA: Todavía no he rastreado completamente esto, pero llamar a registerForContextMenu (ver) establece un indicador suponiendo que desea que el menú contextual se mantenga presionado. Cuando se establece este indicador, la lógica onTouch en AbsListView de alguna manera ya no está activando OnClick. No tengo tiempo para profundizar en esto por completo. Sin embargo, parece que al usar un adaptador simple como un ArrayAdapter, y al utilizar una ListActivity con el ListView predeterminado, tendrá que decidir si desea que el menú contextual aparezca con un clic corto o si puede usar el comando longclick.

Si no está interesado en las pulsaciones largas, puede hacer que su menú contextual trabaje en la pulsación corta deshaciendo el indicador establecido en registerForContextMenu (view);

Quizás otra persona tenga más información o más tiempo para buscar el código.

+0

hice esto, gracias, pero después de que- me puede llamar al menú contextual de 1 elemento de la lista única vez- por qué? – eve

+0

Actualicé la respuesta con más información. Sin embargo, no estoy completamente seguro de lo que está sucediendo, y no tengo tiempo para investigarlo hoy. Publiqué una solución alternativa que podría funcionar para usted. – slund

7

Las otras soluciones publicadas aquí no me funcionaron porque estaba usando un ListFragment. Sin embargo las siguientes soluciones parece que funciona 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.

0

No se olvide de añadir esto después de registerForContextMenu() desactivar clic largo:

listview.setLongClickable(isRestricted()); 
Cuestiones relacionadas