web-dev-qa-db-fra.com

Gestion des événements tactiles Intercept sans étendre ViewGroup

J'ai un RelativeLayout et cette disposition a près de 10 vues en elle.

J'ai mis OnTouchListener à cette mise en page et y travailler, puis je retourne true.

cet écouteur fonctionne bien lorsque je touche la disposition où il n'y a pas de vue (moyenne sur la zone vide). Si je touche aux vues des enfants de cette disposition, cet auditeur ne se déclenche pas ...

et d'après la documentation, j'ai compris qu'il était possible de remplacer onInterceptTouchEvent() en étendant ViewGroup (donc ici, RelativeLayout) et de gérer les événements tactiles avant que les vues enfants ne consomment cet événement ...

cela va faire l'affaire, mais je dois modifier de nombreux fichiers XML où j'ai besoin de cette fonctionnalité en remplaçant RelativeLayout par mon CustomRelativeLayout.

alors ma question est:

existe-t-il un moyen de gérer un événement tactile pour RelativeLayout (groupe de vues de parcours) avant que les vues enfant dans RelativeLayout ne consume l'événement? Je ne veux pas prolonger RelativeLayout...

26
RuntimeException

Essayez de remplacer

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    return super.dispatchTouchEvent(ev);
}

de Activity. Cette méthode est la première à traiter les événements tactiles . Mais dans ce cas, vous devez utiliser les coordonnées actuelles des vues.

20
Michael Katkov

Essayez de renvoyer false dans la méthode onTouchEvent() des vues enfant lors du traitement de l'événement ACTION_DOWN. Ainsi, les événements tactiles de transfert ne seront pas envoyés aux vues enfant, autrement dit, événement non consommé.

1
Sophia

Bien que cela ne soit pas nécessairement idéal, cela fonctionne bien pour les mises en page plus petites qui n'ont pas de contenu dynamique.

En xml, définissez Android:clickable="false" sur tous les descendants du groupe de vues de la présentation (y compris les groupes de vues imbriqués et leurs enfants). Chaque enfant sur lequel l'utilisateur aura cliqué propagera ensuite le clic à son parent, pour arriver éventuellement aux gestionnaires tactiles par défaut du ViewGroup. Assurez-vous de définir le groupe de vues racine, où vous souhaitez obtenir les événements de clic sous la forme Android:clickable="true" ou viewgroup.setClickable(true).

Si vous ajoutez des vues de manière dynamique, appelez view.setClickable(false); avant de l'ajouter à la hiérarchie des vues.

1
Johnny C

Essayez d’ajouter onTouchListener à RelativeLayout

RelativeLayout rl = (RelativeLayout) findViewById( R.id.relativeLauout );
    rl.setOnTouchListener( new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // do something
            return false;
        }
    });

ou utilisez la méthode onTouchEvent de Activity

@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    return super.onTouchEvent(event);
}
0
kris14an