2010-11-18 3 views
2

Une autre question novice. J'ai un menu contextuel que j'applique pour un ListView qui permet simplement à l'utilisateur de déplacer des éléments vers le haut ou vers le bas, ou de supprimer l'élément.Masquer l'élément de menu contextuel Android

J'ai du code dans onContextItemSelected() pour empêcher que les choses ne passent en haut ou en bas de la liste, etc., mais je préfère cacher les éléments du menu contextuel en premier lieu si (par exemple) le premier élément dans la liste est sélectionné.

Je suppose que j'ai besoin de le faire dans onCreateContextMenu, mais je ne sais pas comment.

Voici mon code onCreateContextMenu:

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

Merci,
WTS

Répondre

2

Si un menu contextuel est ouvert pour un ListView, menuInfo contiendra un objet de type AdapterContextMenuInfo, qui vous donne des informations sur quel élément de la liste a été cliqué. S'il s'agit du premier ou du dernier élément, vous pouvez simplement supprimer les entrées correspondantes du menu contextuel, bien que je ne sache pas très bien ce qui se passe s'il ne reste aucune entrée.

+1

Pour les recherches futures ... utilisez AdapterContextMenuInfo adapterInfo = (AdapterContextMenuInfo) menuInfo; –

+0

Et si vous ne voulez pas afficher de menu contextuel pour un élément particulier en fonction de la ligne demandée, vous n'avez qu'à retourner votre onCreateContextMenu() avant de gonfler votre menu. –

11

Dans votre méthode onCreateContextMenu, vous devez obtenir les éléments de menu que vous souhaitez potentiellement masquer et les définir comme non visibles en fonction des positions de la liste.

Quelque chose comme ceci:

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

if(info.position < 1) { 
    myLocationMenuItem = menu.findItem(R.id.myLocation); 
    myLocationMenuItem.setVisible(enable); 
} 
1

Vous pouvez désactiver un élément particulier si vous voulez.

@Override 
     public void onCreateContextMenu(ContextMenu menu, View v, 
       ContextMenuInfo menuInfo) 
    { 
       AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; 

       int position = info.position; 

       // use this position to decide your item clicked 

       menu.clear(); 
       menu.setHeaderTitle("Context Menu Title"); 
       String[] menuItems = getResources().getStringArray(
         R.array.menu_context); 


       for (int i = 0; i < menuItems.length; i++) 
       { 
        menu.add(Menu.NONE, i , i, menuItems[i]); 
       } 
       menu.getItem(0).setEnabled(**Conditional check**); 
       menu.getItem(1).setEnabled(**Conditional check**); 
       menu.getItem(2).setEnabled(**Conditional check**); 
    } 
3

C'est une solution pour un PopupMenu juste au cas où quelqu'un cherche pour cela que je l'ai fait. Ici, j'ai 3 boutons dans menu fichier de mise en page pour PopupMenu et je supprimer certains d'entre eux dans certains cas:

PopupMenu popup = new PopupMenu(this, this.actionButton); 
    popup.setOnMenuItemClickListener(this); 
    MenuInflater inflater = popup.getMenuInflater(); 
    inflater.inflate(R.menu.menu_resume_view, popup.getMenu()); 

    Menu menu = popup.getMenu(); 
    if (this.resume.isPublished()) { 
     menu.removeItem(R.id.menu_button_publish); 
    } 
    else { 
     menu.removeItem(R.id.menu_button_unpublish); 
     menu.removeItem(R.id.menu_button_update_publish_date); 
    } 

    popup.show(); 

Lorsque vous utilisez PopupMenuonPrepareOptionsPanel n'est pas appelé. Donc, vous devez obtenir des éléments de menu par id tout en créant PopupMenu et supprimer ceux qui ne devraient pas être disponibles dans un cas particulier.

+0

Salut toute idée comment puis-je supprimer l'espace de titre si nous utilisons seulement des icônes? https://gist.github.com/mediavrog/9345938 –