J'ai ajouté une image à droite du texte dans un EditText
widget, en utilisant le XML suivant:
<EditText
android:id="@+id/txtsearch"
...
android:layout_gravity="center_vertical"
android:background="@layout/shape"
android:hint="Enter place,city,state"
android:drawableRight="@drawable/cross" />
Mais je veux effacer le EditText
moment où l'on clique sur l'image intégrée. Comment puis-je faire ceci?
Réponses:
En fait, vous n'avez pas besoin d'étendre une classe. Disons que j'ai un EditText editComment avec un drawableRight
nous
getRawX()
parce que nous voulons obtenir la position réelle du toucher à l'écran, et non par rapport au parent.Pour obtenir un clic gauche
la source
event.getRawX()
au lieu deevent.getX()
@AngeloSgetRight()
droit de TextView, qui ne sera pas le droit du dessinable s'il y a du remplissage. L'ajout- editComment.getPaddingRight()
à la fin de votreif
déclaration devrait fonctionner.Très, très bien, merci à tous ceux qui ont contribué à cette discussion. Donc, si vous ne voulez pas faire face à l'inconvénient d'étendre la classe, vous pouvez faire ce qui suit (implémenté pour le bon dessinable uniquement)
Et voici l'implémentation de l'auditeur à nu basée sur la réponse de @ Mark
la source
v.getRight()
parv.getWidth()
.fuzz
la zone capturable soit un peu plus grande, ce qui facilite l'utilisation du petit dessinable.Considérer ce qui suit. Ce n'est pas la solution la plus élégante mais ça marche, je viens de la tester.
Créez une
EditText
classe personnaliséeCustomEditText.java
:Changez votre XML de mise en page en ceci (où
com.example
est le nom de votre package de projet réel):Enfin, ajoutez ceci (ou quelque chose de similaire) à votre activité:
Je pourrais être un peu décalé avec le calcul des limites tactiles pour le dessin imbriqué, mais vous avez l'idée.
J'espère que ça aide.
la source
TextView
place deEditText
. J'ai pris le code et si je clique surTextView
(pas sur l'icône mais sur n'importe quel espace sur leTextView
), la méthodeonTouchEvent(MotionEvent event)
est appelée. Donc, je peux implémenterOnClickListener
pour une habitudeTextView
sans classes supplémentaires telles queCustomEditText
this.getRight()-rBounds.width()
pourquoi ne pas utiliserthis.getMeasuredWidth() - this.getCompoundPaddingRight()
? Ne prendrait-il pas en charge le rembourrage du dessinable et ne se débarrasserait-il pas également de la limite du dessinable?EditText
ne prennent pas en charge la teinture des widgets appropriés lors de l'utilisation d'AppCompat sur les appareils pré-sucettes. UtiliserAppCompatEditText
comme classe parente de votre EditText personnaliséJ'ai créé une classe abstraite utile DrawableClickListener qui implémente OnTouchListener .
En plus de la classe DrawableClickListener , j'ai également créé 4 classes abstraites supplémentaires qui étendent la classe DrawableClickListener et gèrent le clic de la zone de dessin pour le quadrant correct.
Point à considérer
Une chose à considérer est que les images ne sont pas redimensionnées si elles sont faites de cette façon; ainsi les images doivent être mises à l'échelle correctement avant d'être placées dans le ou les dossiers res / drawable .
Si vous définissez un LinearLayout contenant une ImageView et une TextView , il est beaucoup plus facile de manipuler la taille de l'image affichée.
activity_my.xml
MyActivity.java
DrawableClickListener.java
la source
C'est très simple. Disons que vous avez un dessinable sur le côté gauche de votre EditText 'txtsearch'. La suite fera l'affaire.
Si vous voulez un dessin à droite, changez l'instruction if en:
De même, vous pouvez le faire pour tous les tirables composés.
Cet appel de méthode retourne tout le rembourrage de ce côté, y compris les tirables. Vous pouvez l'utiliser même pour TextView, Button etc.
Cliquez ici pour référence sur le site des développeurs Android.
la source
Je pense que c'est beaucoup plus facile si nous utilisons quelques astuces :)
Terminé
la source
RelativeLayout
pour obtenir un bon positionnement, semble juste moins compliqué que les autres solutions et beaucoup moins de code à maintenir.L'utilisation de cette dernière contribution de
contains(x,y)
ne fonctionnera pas directement sur le résultat degetBounds()
(sauf, par coïncidence, lors de l'utilisation de drawables "de gauche"). LagetBounds
méthode ne fournit que lesRect
points de définition de l'élément dessinable normalisé avec l'origine à 0,0 - vous devez donc faire le calcul du message d'origine pour savoir si le clic se trouve dans la zone du dessinable dans le contexte de la contenant les dimensions de EditText, mais changez-le pour le haut, la droite, la gauche, etc. Vous pouvez également décrire unRect
qui a des coordonnées réellement relatives à sa position dans leEditText
conteneur et utilisercontains()
, même si à la fin vous faites le même calcul.La combinaison des deux vous donne une solution assez complète, j'ai seulement ajouté un attribut d'instance
consumesEvent
qui permet à l'utilisateur de l'API de décider si l'événement click doit être transmis ou non en utilisant son résultat pour définirACTION_CANCEL
ou non.De plus, je ne vois pas pourquoi les valeurs
bounds
andactionX
,actionY
sont des attributs d'instance plutôt que simplement locales sur la pile.Voici une découpe d'une implémentation basée sur ce qui précède que j'ai mis en place. Il corrige un problème qui, pour consommer correctement l'événement, doit être renvoyé faux. Il ajoute un facteur "fuzz" à. Dans mon cas d'utilisation d'une icône de commande vocale dans un
EditText
champ, j'ai eu du mal à cliquer, donc la fuzz augmente les limites effectives qui sont considérées comme un clic sur le dessinable. Pour moi, ça15
fonctionnait bien. J'avais seulement besoin,drawableRight
donc je n'ai pas branché les calculs dans les autres, pour économiser de l'espace, mais vous voyez l'idée.la source
En prolongeant l'idée de RyanM, j'ai créé une version plus flexible, qui prend en charge tous les types de dessin (haut, bas, gauche, droite). Alors que le code ci-dessous étend TextView, l'adapter pour un EditText est juste un cas de permutation de "étend TextView" avec "étend EditText". L'instanciation du widget à partir de XML est identique à l'exemple de RyanM, barre le nom du widget.
Le DrawableClickListener est aussi simple que cela:
Et puis la mise en œuvre réelle:
ps: Si vous ne définissez pas l'écouteur, toucher le TextView provoquera une NullPointerException. Vous voudrez peut-être ajouter un peu plus de paranoïa dans le code.
la source
Kotlin est un excellent langage où chaque classe pourrait être étendue avec de nouvelles méthodes. Permet d'introduire une nouvelle méthode pour la classe EditText qui capturera les clics à droite.
Vous pouvez voir qu'il prend la fonction de rappel comme argument qui est appelé lorsque l'utilisateur clique à droite sur le dessin.
la source
ça marche pour moi,
la source
Je sais que c'est assez vieux, mais j'ai récemment dû faire quelque chose de similaire ... Après avoir vu à quel point c'est difficile, j'ai trouvé une solution beaucoup plus simple:
Dans mon cas, j'avais besoin d'un EditText qui avait la possibilité d'effacer le texte avec un bouton. Je voulais qu'il ressemble à SearchView, mais pour un certain nombre de raisons, je ne voulais pas utiliser cette classe. L'exemple ci-dessous montre comment j'ai accompli cela. Même si cela n'a pas à voir avec le changement de focus, les principes sont les mêmes et j'ai pensé qu'il serait plus avantageux de publier du code de travail réel que de rassembler un exemple qui pourrait ne pas fonctionner exactement comme je le souhaitais:
Voici ma mise en page: clearable_edit_text.xml
Et voici la classe qui gonfle cette disposition: ClearableEditText.java
Pour rendre cette réponse plus conforme à la question, les étapes suivantes doivent être suivies:
la source
et si drawable est sur la gauche, cela vous aidera. (pour ceux qui travaillent avec la disposition RTL)
la source
Copiez simplement collez le code suivant et cela fera l'affaire.
la source
Aucune des solutions précédentes n'a fonctionné pour moi dans Xamarin Android . J'ai réussi à faire fonctionner l'écouteur de clics approprié en utilisant les éléments suivants:
Créez l'
OnEditTextTouch
écouteur d'événement suivant :Abonnez-vous à l'événement Touch:
la source
Tout est génial mais pourquoi ne pas le rendre vraiment simple?
J'ai également rencontré cela il n'y a pas si longtemps ... et Android touchlistiner fonctionne très bien mais donne des limites d'utilisation .. et je suis arrivé à une autre solution et j'espère que cela vous aidera:
Vous pouvez maintenant créer un écouteur ou un événement ImageClick et faire ce que vous voulez avec du texte. Ce fichier edittext_round_corners.xml
la source
EditText
devrait êtreandroid:background="@android:color/transparent"
.Mieux vaut avoir ImageButton à droite du texte d'édition et donner une marge de mise en page négative pour chevaucher le texte d'édition. Définissez l'écouteur sur ImageButton et effectuez les opérations.
la source
la source
la source
pour l'écouteur clic gauche dessinable
la source
Les drawables composés ne sont pas censés être cliquables. Il est plus propre d'utiliser des vues séparées dans un LinearLayout horizontal et d'utiliser un gestionnaire de clic dessus.
la source
Pour tous ceux qui ne souhaitent pas implémenter la gestion des clics monstrueuse. Vous pouvez obtenir la même chose avec a
RelativeLayout
. Avec cela, vous avez même une manipulation libre du positionnement de l'étirable.La
ImageView
position sera la même que celle que vous utiliseriezdrawableEnd
- de plus, vous n'avez pas besoin de toute la gestion de l'auditeur tactile. Juste un écouteur de clic pour leImageView
et vous êtes prêt à partir.la source
Cela fonctionne pour moi :) que cela vous aide aussi
la source
J'ai vu plusieurs solutions mais je n'ai été convaincu par aucune d'entre elles. Soit très compliqué soit trop simple (non réutilisable).
C'est mon approche préférée en ce moment:
Et voici l'écouteur tactile réutilisable:
Vous pouvez consulter le Gist ici.
la source
Suivez le code ci-dessous pour un clic droit, gauche, haut, bas dessinable:
}
la source
J'ai implémenté dans Kotlin
la source
Voici ma solution simple, placez-
ImageButton
laEditText
:la source
Je voudrais suggérer un moyen pour dessiner à gauche! J'ai essayé ce code et ça marche.
la source
J'ai implémenté la réponse @aristo_sh dans Mono.Droid (Xamarin), car c'est une méthode anonyme déléguée que vous ne pouvez pas retourner vraie ou fausse, vous devez prendre la prise de e.Event.Handled. Je cache également le clavier au clic
la source
Partage de ma solution généralisée pour la gestion des événements de clic et de toucher composables TextView.
Nous avons d'abord besoin d'un gestionnaire d'événements tactile:
Maintenant, vous pouvez traiter tous les événements tactiles sur n'importe quel composé dessinable de n'importe quel TextView que vous aimez de cette façon:
Uniquement intéressé par les clics? Il suffit de filtrer par action MotionEvent:
Encore une fois, nous pouvons facilement gérer les clics sur n'importe quel composé dessinable de n'importe quel TextView:
J'espère que vous l'avez aimé comme moi. Je vais essayer de le garder à jour ici et dans l' essentiel si quelque chose change.
la source
J'ai créé une classe d'écoute tactile personnalisée simple au lieu d'un EditText personnalisé
}
Il n'y aura pas de dessin possible lorsque le EditText est vide. Un dessinable montrera quand nous avons commencé à éditer pour effacer le EditText.
Vous pouvez simplement définir l'écouteur tactile
mEditText.setOnTouchListener (nouveau MyTouchListener (mEditText));
la source