Dodałem obraz z prawej strony tekstu w EditText
widżecie, używając następującego kodu XML:
<EditText
android:id="@+id/txtsearch"
...
android:layout_gravity="center_vertical"
android:background="@layout/shape"
android:hint="Enter place,city,state"
android:drawableRight="@drawable/cross" />
Chcę jednak wyczyścić, EditText
kiedy kliknięty zostanie osadzony obraz. W jaki sposób mogę to zrobić?
Odpowiedzi:
W rzeczywistości nie musisz przedłużać żadnej klasy. Powiedzmy, że mam EditText editComment z drawableRight
my,
getRawX()
ponieważ chcemy uzyskać rzeczywistą pozycję dotyku na ekranie, a nie względem rodzica.Aby uzyskać lewy bok, kliknij
źródło
event.getRawX()
zamiastevent.getX()
@AngeloSgetRight()
dostaniesz prawo do TextView, który nie będzie miał prawa do rysowania, jeśli będzie dopełnienie. Dodawanie- editComment.getPaddingRight()
na końcu Twojegoif
wyciągu powinno działać.Bardzo, bardzo dobrze, dziękuję wszystkim, którzy przyczynili się do tej dyskusji. Jeśli więc nie chcesz uporać się z niedogodnościami związanymi z rozszerzeniem klasy, możesz wykonać następujące czynności (zaimplementowane tylko dla prawej strony do rysowania)
A oto implementacja nasłuchującego gołej kości oparta na odpowiedzi @ Mark
źródło
v.getRight()
przezv.getWidth()
.fuzz
skutecznie sprawia, że obszar styku jest nieco większy, co ułatwia stuknięcie w mały uchwyt.Rozważ następujące. To nie jest najbardziej eleganckie rozwiązanie, ale działa, właśnie go przetestowałem.
Utwórz niestandardową
EditText
klasęCustomEditText.java
:Zmień XML układu na ten (gdzie
com.example
jest rzeczywista nazwa pakietu projektu):Na koniec dodaj to (lub coś podobnego) do swojej aktywności:
Mógłbym trochę obliczyć granice dotyku dla zagnieżdżonego rysowalnego, ale masz pomysł.
Mam nadzieję, że to pomoże.
źródło
TextView
zamiastEditText
. Wziąłem kod i jeśli kliknęTextView
(nie ikonę, ale dowolne miejsce naTextView
), metodaonTouchEvent(MotionEvent event)
zostanie wywołana. Więc mogę wdrożyćOnClickListener
na zwykłeTextView
bez żadnych dodatkowych klas, takich jakCustomEditText
this.getRight()-rBounds.width()
dlaczego nie używaćthis.getMeasuredWidth() - this.getCompoundPaddingRight()
? Czy nie zajęłoby się wypełnieniem szuflady, a także pozbył się jej granic?EditText
nie obsługują prawidłowego przyciemniania widżetów podczas używania appcompat na urządzeniach sprzed wersji Lollipop. UżyjAppCompatEditText
jako klasy nadrzędnej swojego niestandardowegoStworzyłem użyteczną klasę abstrakcyjną DrawableClickListener, która implementuje OnTouchListener .
Oprócz klasy DrawableClickListener stworzyłem również 4 dodatkowe klasy abstrakcyjne, które rozszerzają klasę DrawableClickListener i obsługują klikanie obszaru do rysowania dla prawidłowego kwadrantu.
Wskaż do rozważenia
Jedną rzeczą do rozważenia jest to, że rozmiary obrazów nie są zmieniane, jeśli są wykonywane w ten sposób; dlatego obrazy muszą być poprawnie skalowane przed umieszczeniem w folderze (folderach) res / drawable .
Jeśli zdefiniujesz LinearLayout zawierający ImageView i TextView , o wiele łatwiej jest manipulować rozmiarem wyświetlanego obrazu.
activity_my.xml
MyActivity.java
DrawableClickListener.java
źródło
To jest bardzo proste. Powiedzmy, że po lewej stronie tekstu „txtsearch” możesz rysować. Następujący załatwi sprawę.
Jeśli chcesz uzyskać prawo do rysowania, zmień instrukcję if na:
Podobnie możesz to zrobić dla wszystkich złożonych rysunków.
To wywołanie metody zwraca całe dopełnienie po tej stronie, w tym wszystkie drawable. Możesz użyć tego nawet do TextView, przycisku itp.
Kliknij tutaj, aby uzyskać informacje na stronie dewelopera Androida.
źródło
Myślę, że jest o wiele łatwiej, jeśli użyjemy sztuczek :)
Gotowe
źródło
RelativeLayout
do uzyskania właściwego pozycjonowania, po prostu wydaje się mniej skomplikowany niż inne rozwiązania i znacznie mniej kodu do utrzymania.Użycie ostatniego wkładu
contains(x,y)
nie zadziała bezpośrednio na wynikgetBounds()
(z wyjątkiem przypadku, gdy używa się „lewych” ciągów). TagetBounds
metoda zapewnia jedynieRect
definiowanie punktów elementu do rysowania znormalizowanego z początkiem na 0,0 - tak więc faktycznie musisz wykonać obliczenia matematyczne oryginalnego postu, aby dowiedzieć się, czy kliknięcie jest w obszarze rysunku w kontekście zawierający wymiary EditText, ale zmień go na górny, prawy, lewy itp. Alternatywnie możesz opisać,Rect
który ma współrzędne w stosunku do jego położenia wEditText
kontenerze i użyj gocontains()
, chociaż ostatecznie robisz to samo.Połączenie ich obu daje całkiem kompletne rozwiązanie, dodałem tylko atrybut instancji,
consumesEvent
który pozwala użytkownikowi interfejsu API zdecydować, czy zdarzenie kliknięcia ma zostać przekazane, czy nie, używając jego wyniku do ustawieniaACTION_CANCEL
.Również, nie mogę zrozumieć, dlaczego
bounds
iactionX
,actionY
wartości atrybutów instancji, a nie tylko lokalny na stosie.Oto wycinek z implementacji opartej na powyższym, którą zestawiłem. Rozwiązuje problem, który wymaga prawidłowego wykorzystania zdarzenia, zwracając wartość false. Dodaje czynnik „fuzz”. W moim przypadku użycia ikony sterowania głosem w
EditText
polu trudno mi było kliknąć, więc fuzz zwiększa efektywne granice, które uważa się za kliknięcie. Dla mnie15
działało dobrze. Potrzebowałem tylko,drawableRight
żeby nie włożyć matematyki do innych, aby zaoszczędzić trochę miejsca, ale widzisz ten pomysł.źródło
Rozwijając pomysł RyanM, stworzyłem bardziej elastyczną wersję, która obsługuje wszystkie typy do rysowania (góra, dół, lewa, prawa). Podczas gdy poniższy kod rozszerza TextView, dostosowanie go do EditText jest jedynie przypadkiem zamiany „rozszerza TextView” na „rozszerza EditText”. Tworzenie instancji widgetu z XML jest identyczne jak w przykładzie RyanM, z wyjątkiem nazwy widgetu.
DrawableClickListener jest tak prosty:
A potem faktyczna implementacja:
ps: Jeśli nie ustawisz detektora, dotknięcie TextView spowoduje wyjątek NullPointerException. Możesz dodać trochę więcej paranoi do kodu.
źródło
Kotlin to świetny język, w którym każdą klasę można rozszerzyć o nowe metody. Pozwala wprowadzić nową metodę dla klasy EditText, która będzie przechwytywać kliknięcia w prawo do rysowania.
Możesz zobaczyć, że przyjmuje funkcję wywołania zwrotnego jako argument, który jest wywoływany, gdy użytkownik kliknie na prawo do rysowania.
źródło
to działa dla mnie
źródło
Wiem, że to dość stare, ale ostatnio musiałem zrobić coś podobnego ... Po zobaczeniu, jak trudne jest to, wymyśliłem znacznie prostsze rozwiązanie:
W moim przypadku potrzebowałem EditText, który miałby możliwość wyczyszczenia tekstu za pomocą przycisku. Chciałem, aby wyglądał jak SearchView, ale z wielu powodów nie chciałem korzystać z tej klasy. Poniższy przykład pokazuje, jak to osiągnąłem. Mimo że nie ma to nic wspólnego ze zmianą fokusu, zasady są takie same i pomyślałem, że bardziej korzystne byłoby opublikowanie rzeczywistego działającego kodu niż zestawienie przykładu, który może nie działać dokładnie tak, jak zamierzałem:
Oto mój układ: clearable_edit_text.xml
A oto klasa, która zawęża ten układ: ClearableEditText.java
Aby ta odpowiedź była bardziej zgodna z pytaniem, należy podjąć następujące kroki:
źródło
a jeśli można wyciągnąć po lewej stronie, to ci pomoże. (dla osób pracujących z układem RTL)
źródło
Wystarczy skopiować i wkleić poniższy kod, a to załatwi sprawę.
źródło
Żadne z poprzednich rozwiązań nie działało dla mnie w systemie Xamarin Android . Byłem w stanie uzyskać odpowiedni detektor kliknięć rysowanych, działający w następujący sposób:
Utwórz następujący
OnEditTextTouch
detektor zdarzeń:Subskrybuj wydarzenie Touch:
źródło
Wszystko jest świetne, ale dlaczego nie uczynić tego naprawdę prostym?
Stawiłem temu czoła również nie tak dawno temu ... i Android touchlistiner działa świetnie, ale daje ograniczenia w użyciu .. i wpadłem na inne rozwiązanie i mam nadzieję, że to pomoże:
Teraz możesz utworzyć detektor lub zdarzenie ImageClick i robić z tekstem wszystko, co chcesz. Ten plik edittext_round_corners.xml
źródło
EditText
powinno byćandroid:background="@android:color/transparent"
.Lepiej, aby ImageButton znajdował się po prawej stronie edytowanego tekstu i dawał ujemny margines układu, aby pokrywał się z edytowanym tekstem. Ustaw nasłuchiwanie na ImageButton i wykonaj operacje.
źródło
źródło
źródło
dla nasłuchiwacza kliknięć z lewej strony
źródło
Składane ciągnienia nie powinny być klikalne. Czystsze jest używanie osobnych widoków w poziomym LinearLayout i używanie na nich obsługi kliknięć.
źródło
Dla każdego, kto nie chce wdrożyć obsługi monstrualnych kliknięć. Możesz osiągnąć to samo za pomocą
RelativeLayout
. Dzięki temu masz nawet swobodną obsługę pozycjonowania wyciągu.ImageView
Pozycja będzie taka sama, jak można wykorzystaćdrawableEnd
- plus nie trzeba całą obsługę dotykowego słuchacza. Tylko odbiornik kliknięć dlaImageView
i jesteś gotowy.źródło
To działa ode mnie :) niech to również pomoże
źródło
Widziałem kilka rozwiązań, ale żadne z nich mnie nie przekonało. Albo bardzo skomplikowany, albo zbyt prosty (jednorazowego użytku).
To jest obecnie moje ulubione podejście:
Oto nasłuchiwanie dotykowe wielokrotnego użytku:
Tutaj możesz zobaczyć Gist.
źródło
Postępuj zgodnie z poniższym kodem, aby klikać prawym, lewym, górnym, dolnym kliknięciem:
}
źródło
Wdrożyłem w Kotlinie
źródło
Oto moje rozwiązanie proste, wystarczy umieścić
ImageButton
nadEditText
:źródło
Chciałbym zaproponować sposób na wyciągnięcie lewej strony! Próbowałem tego kodu i działa.
źródło
Zaimplementowałem odpowiedź @aristo_sh w Mono.Droid (Xamarin), ponieważ jest to anonimowa metoda delegowania, której nie możesz zwrócić true lub false, musisz wziąć e.Event.Handled. Chowam też klawiaturę po kliknięciu
źródło
Udostępnianie mojego ogólnego rozwiązania do obsługi złożonych zdarzeń ClickView i TouchView TextView.
Najpierw potrzebujemy obsługi zdarzeń dotykowych:
Teraz możesz przetwarzać dowolne zdarzenia dotykowe na dowolnym złożonym rysunku dowolnego TextView, który Ci się podoba:
Jesteś zainteresowany tylko kliknięciami? Po prostu odfiltruj według akcji MotionEvent:
Ponownie możemy z łatwością obsługiwać kliknięcia dowolnego związku rysowalnego z dowolnego TextView:
Mam nadzieję, że podobało ci się tak jak ja. Postaram się go aktualizować tutaj i w powiązanej treści, jeśli coś się zmieni.
źródło
Stworzyłem prostą niestandardową klasę nasłuchiwania dotykowego zamiast niestandardowego EditText
}
Nie będzie można rysować, gdy EditText jest pusty. Drawable pokaże, kiedy zaczęliśmy edycję, aby wyczyścić EditText.
Możesz po prostu ustawić detektor dotyku
mEditText.setOnTouchListener (nowy MyTouchListener (mEditText));
źródło