2011-05-05 3 views
7

Désolé pour une question stupide, mais ce que je devrais changer/ajouter dans ce code pour afficher le menu contextuel en cliquant brièvement sur l'élément dans la vue liste?Menu contextuel par clic court

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); 
    } 
} 

Répondre

5

Vous devez appeler registerForContextMenu sur la vue.

ÉDITÉE ajouter appel à setLongClickable (false)

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); 
} 

Vous aurez aussi besoin d'ajouter réellement des éléments de menu ou le menu ne montrera pas non plus. Il ne suffit pas de régler l'en-tête.

REMARQUE: je n'ai pas encore complètement suivi cette opération, mais l'appel de registerForContextMenu (view) définit un indicateur en supposant que vous souhaitez que le menu contextuel soit activé longtemps. Lorsque cet indicateur est défini, la logique onTouch dans AbsListView ne déclenche plus onClick. Je n'ai pas le temps de creuser ça complètement. Il semblerait cependant que lorsque vous utilisez un adaptateur simple comme un ArrayAdapter, et en utilisant un ListActivity avec le ListView par défaut, vous devrez décider entre avoir le menu contextuel apparaître sur un clic court, ou être capable d'utiliser longclick. Si vous n'êtes pas intéressé par les appuis longs, vous pouvez faire fonctionner votre menu contextuel en appuyant brièvement sur le drapeau défini dans registerForContextMenu (vue);

Peut-être que quelqu'un d'autre a plus d'informations ou plus de temps pour explorer le code.

+0

J'ai fait cela, merci, mais après that- je peux appeler le menu contextuel pour 1 élément de la liste que la raison pour laquelle passage unique? – eve

+0

J'ai mis à jour la réponse avec plus d'informations. Cependant, je ne suis pas tout à fait sûr de ce qui se passe, et je n'ai pas le temps de le faire aujourd'hui. J'ai posté une solution de contournement qui pourrait fonctionner pour vous. – slund

7

Les autres solutions publiées ici ne fonctionnaient pas pour moi parce que j'utilisais un ListFragment. Cependant, les solutions suivantes semble fonctionner assez bien pour les deux une ListFragment et un ListActivity (ou tout simplement une ancienne listview en général):

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

Il est beaucoup plus simple et élégante. En fait, c'est en réalité la façon dont la classe ListView initie le menu contextuel sur un long clic.

0

Ne pas oublier d'ajouter ceci après registerForContextMenu() désactiver clic long:

listview.setLongClickable(isRestricted()); 
Questions connexes