2010-06-17 29 views
1

Est-il possible de créer un menu contextuel dynamique dans Android? Ce que je veux dire par exemple, si j'ai une liste d'éléments, qui peut être dans deux états: "lire" et "non lu". Je veux être capable de faire apparaître un menu contextuel avec une option de "Mark as Read" pour les éléments non lus, et "Mark as Unread" pour les éléments lus.Options du menu contextuel dynamique

Ainsi en cliquant sur:

> read 
> unread <-- click 
> read 

va afficher le menu contextuel "Marquer comme lu" résultat:

> read 
> read 
> read <-- click 

affiche le menu "Marquer comme non lu".

Y at-il une fonction qui me permet de personnaliser la création du menu contextuel, juste avant son affichage?

Toute aide est la bienvenue!

Répondre

5

Comme vous ne fournissez pas le code, voici est l'approche de base:

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

    String actionString = "Mark as Read"; 

    // if it's alredy read 
    if (((TextView) info.targetView).getText().toString().equals("read")) 
     actionString = "Mark as Unread"; 

    menu.setHeaderTitle("Action"); 
    menu.add(0, 0, 0, actionString); 
} 

Dans ce cas, je suppose que la liste est peuplée de TextView s qui peuvent avoir la chaîne « lire » ou "non lu" dedans. Comme je l'ai déjà dit, c'est une approche très basique. L'important ici est de remarquer comment l'objet ContextMenu.ContextMenuInfo est utilisé. Pour lire l'état de l'élément sélectionné, vous pouvez utiliser la méthode item.getMenuInfo() à l'intérieur de la méthode onContextItemSelected(MenuItem item).

+0

Que représente le membre .targetView? Je vous remercie! – drozzy

+0

Lorsque vous créez une liste sur Android, chaque élément de la liste est un 'View'. Vous pouvez utiliser différents types de Vues, ​​par exemple un simple TextView (comme dans l'exemple ci-dessus) ou une vue personnalisée (par exemple, une mise en page externe dans un XML avec un LinearLayout, différents TextView, Images, etc). Le 'targetView' représente la' View' que vous utilisez pour afficher chaque élément de la liste. – Cristian

1

La façon dont je voudrais faire est de créer deux éléments de menu séparés, « Marquer comme lu » et « Marquer comme non lu » puis cacher un d'entre eux chaque fois que le menu est affiché:

@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); 
    if (<is unread>) 
     menu.findItem(R.id.mark_unread).setVisible(false); 
    else 
     menu.findItem(R.id.mark_read).setVisible(false); 
} 

Réglage de la le texte (et surtout la lecture du texte) directement à partir du code est fragile; le texte peut changer, et si vous voulez supporter plusieurs langues?

Questions connexes