2010-09-15 5 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); 

    } 

Bonjour,Android ContextMenu ouvert sur clic court + élément passe cliquée détails

Je suis en train d'ouvrir un contextMenu sur cliquez entrefilet. Je n'ai réussi à le faire que si j'ajoute registerForContextMenu(getListView()); quelque part, mais cela déclenche également contextMenu sur un clic long (ce que je ne veux pas arriver).

  • Essayé view.showContextMenu() mais il ne fait rien sauf si j'ajoute le registerForContextMenu(getListView());.
  • Essayé enregistrer l'élément cliqué en premier et ensuite appeler la showContextMenu() mais ne rien faire aussi bien ...

Aussi, je veux obtenir l'image de l'élément cliqué + texte afin que je puisse les utiliser dans le menu contextuel.

Appréciez l'aide!

Répondre

4

Solution:

@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;

vous donne plus de détails sur l'élément de liste sur lequel vous avez cliqué. Ensuite, vous pouvez utiliser info.id, info.position et ainsi de suite pour récupérer les détails et les utiliser les actions (modifier, supprimer ...).

+0

merci pour cela! J'ai utilisé ceci pour construire sur l'obtention de l'élément cliqué à partir d'un adaptateur personnalisé. –

0

Je crois que si vous ajoutez un OnLongClickListener à la vue, vous devriez pouvoir l'empêcher d'afficher le menu contextuel lors d'un clic long.

En onItemClick le paramètre view est la vue d'élément, de sorte que vous devriez être en mesure d'obtenir ImageViews ou TextViews de ce:

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

Salut Mayra, Je sais ... mais pour une raison quelconque, il ne comprend pas cela. pas de fermeture de force .. affiche simplement les détails du premier élément de la liste. –

+0

"Ce n'est pas ça"? –

+0

public void onCreateContextMenu (menu ContextMenu, View v, ContextMenuInfo menuInfo) { \t super.onCreateContextMenu (menu, v, menuInfo); \t Texte TextView = (TextView) v.findViewById (R.id.btitle); \t menu.setHeaderTitle (text.getText()); ........ } Obtient uniquement le titre du premier élément et non l'élément cliqué. –

59

j'ai pu ouvrir un menu contextuel sur le bouton, cliquez avec le code suivant:

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

la propriété situé à seulement onClick du bouton pour onButtonClickEvent. Un long clic ne déclenchera pas le menu contextuel, puisqu'il n'est pas enregistré juste après son affichage.

+1

Cela a fonctionné pour moi aussi, juste pour le problème du clic court. – iCantSeeSharp

+1

@konrad ... Superbe ... Grande aide !! :) – Noman

+0

+1 - J'avais besoin de cela dans le cadre de faire une ligne de table cliquable, fait le travail, merci beaucoup! – AgentKnopf

38

En ce qui concerne l'ouverture d'un menu contextuel sur un court clic:

Les autres solutions publiées ici ne fonctionnent pas pour moi parce que je travaillais avec un ListFragment. Cependant, la solution suivante 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égant. En fait, c'est en réalité la façon dont la classe ListView initie le menu contextuel sur un long clic.

+4

Bien que ce soit la solution que je cherchais (+1!), Cela ne semble pas correspondre à ce que l'OP recherchait car le menu contextuel s'affichera toujours sur un long clic. – Blumer

+1

@Blumer Oui, je sais:/Mais puisque le titre de la question ne fait aucune mention de cette mise en garde, j'ai décidé d'afficher ma solution pour les personnes comme vous et moi qui trébucheraient sur cette question sans avoir cette exigence . –

+1

+1 L'utilisation de 'l.showContextMenuForChild (v)' au lieu de 'openContextMenu (l)' en appelant 'item.getMenuInfo()' dans 'onContextItemSelected' retournera un' AdapterContextMenuInfo' valide. – tidbeck

0

Ma solution:

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

Dans mon cas, j'avais BaseAdapter et cliquez sur le bouton mis en œuvre pour chaque élément listview (dans la méthode getView):

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