2010-10-04 21 views
7

J'utilise une vue Galerie où la vue correspondant à chaque élément est non triviale et comprend du texte ainsi que plusieurs boutons.Galerie/AdapterView État dessinable par l'enfant

Lorsque je clique pour faire glisser la vue de la galerie (quelque part pas sur l'un des boutons), l'état imprimable du bouton devient enfoncé et apparaît comme si tous les boutons étaient en cours de pression. De plus, le même comportement se produit pour l'état sélectionné (par exemple, tout le texte de l'enfant TextViews change de couleur).

J'essaie d'empêcher ce comportement et j'ai trouvé l'attribut android: duplicateParentState xml ainsi que la propriété setDuplicateParentStateEnabled. Cela semble devoir accomplir ce que j'essaie de faire, mais cela semble n'avoir aucun effet.

Des idées?

Répondre

3

Vous ne savez pas où la propriété duplicateParentState entre en jeu, mais la rupture de la source indique qu'elle n'est jamais prise en compte pour les états sélectionné et pressé. Je voudrais créer une classe de vue personnalisée et remplacer les méthodes dispatchSetSelected et dispatchSetPressed.

8

Peut-être un peu sur le côté tard, mais ayant rencontré ce problème moi-même récemment, j'ai une solution.

dispatchSetSelected et dispatchSetPressed ne sont pas vraiment utiles ici, car les méthodes que vous avez réellement besoin de remplacer sont privées dans Gallery.

La solution est d'ajouter une mise en page supplémentaire (j'ai utilisé une sous-classe de LinearLayout) autour de la vue enfant, qui remplace setPressed (boolean) et l'ignore tout simplement. Cela empêche la galerie de forcer son état enfoncé sur les enfants, tout en permettant à ces enfants d'être activés directement, sans empêcher les événements de se propager vers le haut.

+0

Cela fonctionne. Merci beaucoup! – yuku

+0

correction incroyable! Est-ce que quelqu'un sait si c'est un bug signalé pour Android? Semble ne pas être un comportement vraiment attendu. – MikeIsrael

1

Si vous arrive d'étendre de la galerie pour créer votre propre version personnalisée, vous pouvez simplement faire:

@Override 
    public boolean onDown(MotionEvent e) { 
    // Ignore onDown events in order to avoid having every child's state set to 'pressed' 
    return true; 
    } 

Cela permettra toujours les enfants de galerie personnalisée pour recevoir correctement les événements de clic, et le balayage vers/jetant fonctionne comme prévu.