Ich habe ein Bild rechts vom Text in einem EditText
Widget mit der folgenden XML-Datei hinzugefügt :
<EditText
android:id="@+id/txtsearch"
...
android:layout_gravity="center_vertical"
android:background="@layout/shape"
android:hint="Enter place,city,state"
android:drawableRight="@drawable/cross" />
Aber ich möchte das löschen, EditText
wenn auf das eingebettete Bild geklickt wird. Wie kann ich das machen?
Antworten:
Eigentlich müssen Sie keine Klasse erweitern. Angenommen, ich habe ein EditText editComment mit einem drawableRight
wir,
getRawX()
weil wir die tatsächliche Position der Berührung auf dem Bildschirm erhalten möchten, nicht relativ zum Elternteil.Um auf die linke Seite zu gelangen, klicken Sie
quelle
event.getRawX()
stattevent.getX()
@AngeloSgetRight()
das Recht auf die Textansicht erhalten, die bei Polsterung nicht das Recht des Zeichens ist. Das Hinzufügen- editComment.getPaddingRight()
am Ende Ihrerif
Aussage sollte funktionieren.Sehr, sehr gut, danke an alle, die zu dieser Diskussion beigetragen haben. Wenn Sie sich also nicht mit den Unannehmlichkeiten beim Erweitern der Klasse befassen möchten, können Sie Folgendes tun (nur für die richtige Zeichnung implementiert).
Und hier ist die Implementierung des Bare-Bone-Listeners basierend auf der Antwort von @ Mark
quelle
v.getRight()
durch ersetzenv.getWidth()
.fuzz
aus, als würde der tippbare Bereich effektiv etwas größer, was das Tippen auf den kleinen Zeichenbereich erleichtert.Folgendes berücksichtigen. Es ist nicht die eleganteste Lösung, aber es funktioniert, ich habe es gerade getestet.
Erstellen Sie eine benutzerdefinierte
EditText
KlasseCustomEditText.java
:Ändern Sie Ihr Layout-XML in dieses (wo
com.example
ist Ihr tatsächlicher Projektpaketname):Fügen Sie abschließend Folgendes (oder etwas Ähnliches) zu Ihrer Aktivität hinzu:
Ich bin vielleicht ein bisschen daneben bei der Berechnung der Berührungsgrenzen für das verschachtelte Drawable, aber Sie haben die Idee.
Ich hoffe das hilft.
quelle
TextView
statt verwendetEditText
. Ich habe den Code genommen und wenn ich aufTextView
(nicht auf das Symbol, sondern auf ein Leerzeichen aufTextView
) klicke, wird die MethodeonTouchEvent(MotionEvent event)
aufgerufen. So kann ichOnClickListener
für eine üblicheTextView
ohne zusätzliche Klassen wieCustomEditText
this.getRight()-rBounds.width()
warum nicht verwendenthis.getMeasuredWidth() - this.getCompoundPaddingRight()
? Würde es sich nicht um die Polsterung des Drawables kümmern und auch die Bindung des Drawables loswerden?EditText
unterstützen keine ordnungsgemäße Tönung von Widgets, wenn Appcompat auf Pre-Lollipop-Geräten verwendet wird. Verwenden SieAppCompatEditText
als übergeordnete Klasse Ihres benutzerdefinierten EditTextIch habe eine nützliche abstrakte Klasse DrawableClickListener erstellt, die OnTouchListener implementiert .
Zusätzlich zur DrawableClickListener- Klasse habe ich 4 zusätzliche abstrakte Klassen erstellt, die die DrawableClickListener- Klasse erweitern und das Klicken auf den Zeichenbereich für den richtigen Quadranten behandeln.
Zu berücksichtigender Punkt
Eine zu berücksichtigende Sache ist, dass die Größe der Bilder auf diese Weise nicht geändert wird. Daher müssen die Bilder korrekt skaliert werden, bevor sie in den res / drawable- Ordner gelegt werden.
Wenn Sie ein LinearLayout definieren, das eine ImageView und eine TextView enthält , ist es viel einfacher, die Größe des angezeigten Bildes zu ändern.
activity_my.xml
MyActivity.java
DrawableClickListener.java
quelle
Es ist sehr einfach. Nehmen wir an, Sie haben auf der linken Seite Ihres EditText 'txtsearch' ein Zeichen. Das Folgende wird den Trick machen.
Wenn Sie eine richtige Zeichnung wünschen, ändern Sie die if-Anweisung in:
Ebenso können Sie dies für alle zusammengesetzten Zeichen tun.
Dieser Methodenaufruf gibt alle Auffüllungen auf dieser Seite einschließlich aller Drawables zurück. Sie können dies sogar für TextView, Button usw. verwenden.
Klicken Sie hier als Referenz von der Android-Entwickler-Website.
quelle
Die Verwendung des letzten Beitrags
contains(x,y)
funktioniert nicht direkt mit dem Ergebnis vongetBounds()
(außer zufällig, wenn "linke" Zeichen verwendet werden). DiegetBounds
Methode liefert nur dieRect
Definitionspunkte des zeichnbaren Elements, die mit dem Ursprung bei 0,0 normalisiert sind. Sie müssen also tatsächlich die Berechnung des ursprünglichen Beitrags durchführen, um herauszufinden, ob sich der Klick im Kontext des zeichnbaren Elements im Kontext des befindet Enthält die Abmessungen von EditText, ändert sie jedoch für oben, rechts, links usw. Alternativ können Sie eine beschreibenRect
, deren Koordinaten tatsächlich relativ zu ihrer Position imEditText
Container sind, und sie verwendencontains()
, obwohl Sie am Ende die gleiche Berechnung durchführen.Wenn Sie beide kombinieren, erhalten Sie eine ziemlich vollständige Lösung. Ich habe nur ein Instanzattribut hinzugefügt
consumesEvent
, mit dem der API-Benutzer entscheiden kann, ob das Klickereignis weitergeleitet werden soll oder nicht, indem er das Ergebnis zum Festlegen verwendetACTION_CANCEL
oder nicht.Ich kann auch nicht verstehen , warum das
bounds
undactionX
,actionY
Werte Instanzattribute sind und nicht nur lokal auf dem Stapel.Hier ist ein Ausschnitt aus einer Implementierung, die auf den oben genannten basiert, die ich zusammengestellt habe. Es behebt ein Problem, bei dem false zurückgegeben werden muss, um das Ereignis ordnungsgemäß zu nutzen. Es fügt einen "Fuzz" -Faktor hinzu. In meinem Anwendungsfall eines Sprachsteuerungssymbols in einem
EditText
Feld fiel mir das Klicken schwer, sodass der Flaum die effektiven Grenzen erhöht, die als Klicken auf das Zeichenelement gelten. Für mich15
hat gut funktioniert. Ich brauchte nur,drawableRight
damit ich die Mathematik nicht in die anderen steckte, um etwas Platz zu sparen, aber Sie sehen die Idee.quelle
Ich denke, es ist viel einfacher, wenn wir ein paar Tricks anwenden :)
Getan
quelle
RelativeLayout
, um eine korrekte Positionierung zu erreichen. Es scheint nur weniger kompliziert als andere Lösungen zu sein und weitaus weniger Code zu warten.Kotlin ist eine großartige Sprache, in der jede Klasse mit neuen Methoden erweitert werden kann. Lassen Sie uns eine neue Methode für die EditText-Klasse einführen, mit der Klicks nach rechts gezeichnet werden können.
Sie können sehen, dass die Rückruffunktion als Argument verwendet wird, das aufgerufen wird, wenn der Benutzer auf rechts zeichnbar klickt.
quelle
Ausgehend von der Idee von RyanM habe ich eine flexiblere Version erstellt, die alle Zeichentypen (oben, unten, links, rechts) unterstützt. Während der folgende Code TextView erweitert, ist das Anpassen für einen EditText nur ein Fall des Austauschs von "Erweitert TextView" gegen "Erweitert EditText". Instanziierung des Widgets aus XML ist identisch wie im Beispiel von RyanM, abgesehen vom Widget-Namen.
Der DrawableClickListener ist so einfach:
Und dann die eigentliche Umsetzung:
ps: Wenn Sie den Listener nicht einstellen, führt das Berühren der Textansicht zu einer NullPointerException. Vielleicht möchten Sie dem Code noch etwas Paranoia hinzufügen.
quelle
es funktioniert für mich,
quelle
Ich weiß, dass dies ziemlich alt ist, aber ich musste kürzlich etwas Ähnliches tun ... Nachdem ich gesehen hatte, wie schwierig das ist, habe ich eine viel einfachere Lösung gefunden:
In meinem Fall brauchte ich einen EditText, mit dem der Text mit einer Schaltfläche gelöscht werden konnte. Ich wollte, dass es wie SearchView aussieht, aber aus mehreren Gründen wollte ich diese Klasse nicht verwenden. Das folgende Beispiel zeigt, wie ich dies erreicht habe. Auch wenn es nicht mit einer Änderung des Fokus zu tun hat, sind die Prinzipien dieselben und ich dachte, es wäre vorteilhafter, tatsächlichen Arbeitscode zu veröffentlichen, als ein Beispiel zusammenzustellen, das möglicherweise nicht genau so funktioniert, wie ich es beabsichtigt hatte:
Hier ist mein Layout: clearable_edit_text.xml
Und hier ist die Klasse, die dieses Layout aufbläst: ClearableEditText.java
Um diese Antwort besser an die Frage anzupassen, sollten die folgenden Schritte unternommen werden:
quelle
und wenn links zeichnbar ist, hilft dir das. (für diejenigen, die mit RTL-Layout arbeiten)
quelle
Kopieren Sie einfach den folgenden Code und es macht den Trick.
quelle
Keine der vorherigen Lösungen funktionierte für mich in Xamarin Android . Ich konnte den richtigen zeichnbaren Klick-Listener wie folgt zum Laufen bringen:
Erstellen Sie den folgenden
OnEditTextTouch
Ereignis-Listener:Abonnieren Sie das Touch-Event:
quelle
Es ist alles großartig, aber warum nicht wirklich einfach machen?
Ich habe mich auch vor nicht allzu langer Zeit damit auseinandergesetzt ... und Android Touchlistiner funktioniert großartig, gibt aber Einschränkungen bei der Verwendung ... und ich bin zu einer anderen Lösung gekommen und hoffe, dass dies Ihnen helfen wird:
Jetzt können Sie einen ImageClick-Listener oder ein Ereignis erstellen und mit Text tun, was immer Sie wollen. Diese Datei edittext_round_corners.xml
quelle
EditText
sollte seinandroid:background="@android:color/transparent"
.Es ist besser, den ImageButton rechts neben dem Text zu bearbeiten und einen negativen Layoutrand anzugeben, der sich mit dem Bearbeitungstext überschneidet. Stellen Sie den Listener auf ImageButton ein und führen Sie Operationen aus.
quelle
quelle
quelle
für links zeichnbaren Klick Listener
quelle
Zusammengesetzte Drawables dürfen nicht anklickbar sein. Es ist sauberer, separate Ansichten in einem horizontalen LinearLayout zu verwenden und einen Klick-Handler darauf zu verwenden.
quelle
Für alle, die das monströse Klick-Handling nicht implementieren möchten. Sie können das gleiche mit einem erreichen
RelativeLayout
. Damit haben Sie sogar freie Hand bei der Positionierung des Drawables.Die
ImageView
Position ist die gleiche, die Sie verwenden würdendrawableEnd
- und Sie benötigen nicht die gesamte Handhabung des Touch Listeners. Nur ein Klick Listener für dieImageView
und Sie können loslegen.quelle
Das funktioniert für mich :) möge das auch dir helfen
quelle
Ich habe mehrere Lösungen gesehen, aber keine hat mich überzeugt. Entweder sehr kompliziert oder zu einfach (nicht wiederverwendbar).
Dies ist momentan mein Lieblingsansatz:
Und dies ist der wiederverwendbare Touch-Listener:
Sie können sich das Wesentliche hier ansehen.
quelle
Befolgen Sie den folgenden Code, um nach rechts, links, oben und unten zu zeichnen:
}}
quelle
Ich habe in Kotlin implementiert
quelle
Hier ist meine einfache Lösung, sondern wird einfach
ImageButton
überEditText
:quelle
Ich möchte einen Weg für zeichnbares Links vorschlagen! Ich habe diesen Code ausprobiert und funktioniert.
quelle
Ich habe die Antwort @aristo_sh in Mono.Droid (Xamarin) implementiert, da es sich um eine anonyme Delegatenmethode handelt, die Sie nicht als wahr oder falsch zurückgeben können. Sie müssen e.Event.Handled übernehmen. Ich verstecke auch die Tastatur beim Klicken
quelle
Teilen meiner allgemeinen Lösung für die Verarbeitung von zusammensetzbaren ClickV- und Touch-Ereignissen mit zusammengesetzter TextView-Zeichnung.
Zuerst brauchen wir einen Touch Event Handler:
Jetzt können Sie beliebige Berührungsereignisse auf einer beliebigen Verbindung verarbeiten, die in einer beliebigen Textansicht gezeichnet werden kann:
Nur an Klicks interessiert? Filtern Sie einfach nach MotionEvent-Aktion aus:
Auch hier können wir problemlos Klicks auf jede zusammengesetzte Zeichnung von TextView verarbeiten:
Hoffe es hat euch gefallen wie mir. Ich werde versuchen, es hier und in verwandten Abschnitten auf dem neuesten Stand zu halten, wenn sich etwas ändert.
quelle
Ich habe eine einfache benutzerdefinierte Touch-Listener-Klasse anstelle eines benutzerdefinierten EditText erstellt
}}
Wenn der EditText leer ist, kann nicht gezeichnet werden. Ein Zeichen wird angezeigt, wenn wir mit der Bearbeitung begonnen haben, um den EditText zu löschen.
Sie können einfach den Touch Listener einstellen
mEditText.setOnTouchListener (neuer MyTouchListener (mEditText));
quelle