J'ai un TextView dans une mise en page dont l'arrière-plan est un sélecteur. Et le texte de TextView est défini sur Etendu à partir de HTML . Ensuite, je règle TextView avec LinkMovementMethod.
Maintenant, lorsque je tape sur TextView, l'événement click n'est pas envoyé à sa disposition parent pour déclencher le sélecteur.
Comment cela devrait-il être résolu?
Je pense que vous devez utiliser l'une de ces méthodes pour pouvoir intercepter l'événement avant qu'il ne soit envoyé aux composants appropriés:
Activity.dispatchTouchEvent(MotionEvent)
- Ceci permet à votre activité d'intercepter tous les événements tactiles avant qu'ils ne soient envoyés à la fenêtre.
ViewGroup.onInterceptTouchEvent(MotionEvent)
- Cela permet à un groupe de vues de voir les événements au fur et à mesure qu'ils sont envoyés aux vues enfants.
ViewParent.requestDisallowInterceptTouchEvent(boolean)
- Appelez une vue parent pour indiquer qu'elle ne doit pas intercepter les événements tactiles avec onInterceptTouchEvent (MotionEvent).
Plus d'informations ici .
J'espère que cela pourra aider.
Déclarez que votre TextView
n'est pas cliquable/focalisable en utilisant Android:clickable="false"
et Android:focusable="false"
ou v.setClickable(false)
et v.setFocusable(false)
Les événements de clic doivent maintenant être envoyés au parent de la TextView
.
Remarque:
Pour y parvenir, vous devez ajouter un clic à sa parent
directe. ou définissez Android:clickable="false"
et Android:focusable="false"
sur son parent direct pour transmettre le programme d'écoute à un autre parent .
Parfois seulement cela aide:
View child = parent.findViewById(R.id.btnMoreText);
child.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
View parent = (View) v.getParent();
parent.performClick();
}
});
Une autre variante ne fonctionne pas toujours:
child.setOnClickListener(null);
Mettre
Android:duplicateParentState="true"
dans enfant, les vues obtiennent son état dessinable (focalisé, appuyé, etc.) de son parent direct plutôt que de lui-même . vous pouvez définir onclick pour parent et faire appel à l'enfant sur lequel vous avez cliqué
Si votre TextView
crée des problèmes de clic, supprimez Android:inputType=""
de votre fichier xml.
Si vous voulez à la fois OnTouch
et OnClick
écouteur à parent et enfant voir les deux, veuillez utiliser l'astuce ci-dessous:
ScrollView utilisateur en tant que vue parent et à l'intérieur de celui qui a placé votre vue enfant dans Relative/LinearLayout.
Assurez Parent ScrollView Android:fillViewport="true"
afin que la vue ne soit pas défilée.
Définissez ensuite OnTouch
auditeur sur parent et OnClick
auditeur sur Vues enfant ..__ et profitez des rappels de l'écouteur.
Cette réponse est similaire à La réponse d'Alexandre Ukhov , sauf qu'elle utilise des événements tactiles plutôt que des événements de clic. Ces événements permettent au parent d’afficher les états pressés appropriés (par exemple, effet d’ondulation). Cette réponse est également en Kotlin au lieu de Java.
view.setOnTouchListener { view, motionEvent ->
(view.parent as View).onTouchEvent(motionEvent)
}