2009-10-08 5 views
2

J'ai un champ de liste d'objets personnalisé avec une routine de défilement implémentée.moveFocus n'est pas appelé

public int moveFocus(int amount, int status, int time) { 
    invalidate(getSelectedIndex()); 

    int unused = super.moveFocus(amount, status, time); 
    return Math.abs(unused) + 1; 
} 

public boolean navigationMovement(int dx, int dy, int status, int time) { 
    if (dy > 0) { 
    if (selectedIndex < getSize() - 1) { 
    setSelectedIndex(selectedIndex + 1);  
    } 
    } else if (dy < 0) { 
    if (selectedIndex > 0) { 
    setSelectedIndex(selectedIndex - 1); 
    } 
    } 

    return true; 
}  

Scrolling fonctionne très bien quand je défiler avec molette, mais se brise lorsque l'application est lancée sur un appareil avec boule de commande. J'ai compris que ce problème réside dans cadre méthode moveFocus qui n'est pas appelé du tout lorsque je fais défiler avec trackball.

Répondre

1

Le problème a été résolu en remplaçant return true; par return false; dans la méthode navigationMovement. Ceci est un bon exemple de conception d'api buggée. Lorsque vous voyez une méthode de gestion d'événement gui comme celle-ci renvoyant un booléen, votre première et unique suggestion est que la valeur de retour signifie l'événement a été consommé. Mais dans le cas de la méthode navigationMovement vous avez tort. Voici un extrait de JDE 4.2.1 javadoc


Paramètres: dx - Magnitude du mouvement de navigation: négatif pour aller à gauche et postive un droit de déplacement. dy - Amplitude du mouvement de navigation: négative pour un mouvement vers le haut, et positive pour un mouvement vers le bas. status - Champ de bits des valeurs définies par KeypadListener. time - Nombre de millisecondes depuis la mise sous tension de l'appareil.

Retours: False (classes qui étendent Le champ doit remplacer cette méthode pour fournir un traitement spécifique ).

Bravo RIM!

+1

Qui définit si elle est consommée ou non. Retourne true pour consommer, false sinon. Ainsi, votre navigationMovement consommait l'événement avant que votre moveFocus puisse le traiter. Votre documentation de Field mal lu. Cela dit juste de ne pas consommer l'événement si cette fonction n'est pas remplacée mais la sous-classe. C'est peut-être un peu flou, mais cela fonctionne comme prévu. – Fostah

+1

Je pense que vous n'avez pas lu la description du problème attentivement. Quand je retourne TRUE, j'obtiens un comportement différent qui dépend si j'utilise TRACKWHEEL ou TRACKBALL. Dans le cas de TRACKWHEEL, 'moveFocus' est appelé, par contre si TRACKBALL est la source de l'événement, alors' moveFocus' n'est pas appelé. – nixau

+0

Quand je retourne FALSE dans la méthode 'navigationMovement'' moveFocus' n'est pas appelé du tout! – nixau

Questions connexes