Zmieniam wartość EditText
włączenia keyListener
.
Ale kiedy zmieniam tekst, kursor przesuwa się na początek EditText
. Potrzebuję kursora na końcu tekstu.
Jak przesunąć kursor na koniec tekstu w EditText
.
Zmieniam wartość EditText
włączenia keyListener
.
Ale kiedy zmieniam tekst, kursor przesuwa się na początek EditText
. Potrzebuję kursora na końcu tekstu.
Jak przesunąć kursor na koniec tekstu w EditText
.
EditText
s jako elementyListView
. Jeśli chodzi o eksperymenty, dokonałem pewnych zmian w samymListView
kodzie źródłowym, który jest dość złożoną bestią, i przetestowałem na emulatorze. Było to związane z zarządzaniem kontrolą fokusu przez komponent. Oczywiście nie jest to rozwiązanie, które mógłbym pomóc naszemu przyjacielowi. :)OnFocusChanged
wywołania zwrotnego. Rozwiązaniem jest umieszczenie setSelection w pliku wykonywalnym i uruchomienie go w głównym wątku. Sprawdź tutaj stackoverflow.com/a/32156989/4514796Odpowiedzi:
Spróbuj tego:
źródło
onSelectionChanged()
metodęEditText
klasy:public void onSelectionChanged(int start, int end) { CharSequence text = getText(); if (text != null) { if (start != text.length() || end != text.length()) { setSelection(text.length(), text.length()); return; } } super.onSelectionChanged(start, end); }
Istnieje funkcja o nazwie append dla ediitext, która dołącza wartość ciągu do bieżącej wartości edittext i umieszcza kursor na końcu wartości. Możesz mieć wartość ciągu jako bieżącą samą wartość ediitext i wywołać append ();
źródło
myedittext.append("");
myedittext.append("");
nie działała dla mnie!Selection
jest poprawnym sposobem na osiągnięcie tego IMO.Kotlin :
ustaw kursor w pozycji początkowej :
ustaw kursor na końcu EditText :
Pod kodem należy umieścić kursor po drugim znaku:
JAVA :
ustaw kursor w pozycji początkowej :
ustaw kursor na końcu EditText :
Pod kodem należy umieścić kursor po drugim znaku:
źródło
findViewById(R.id.edittext_id) as EditText
zfindViewById<EditText>(R.id.edittext_id)
lub po prostu uniknąć casting w przypadku korzystaniaAPI 26+
Jeśli zadzwoniłeś
setText
wcześniej, a nowy tekst nie dostał się w fazie układu, zadzwońsetSelection
w osobnym uruchamianym przezView.post(Runnable)
(repost z tego tematu).Dla mnie ten kod działa:
Edytuj 16.05.2019: Teraz używam do tego rozszerzenia Kotlin:
a następnie - editText.placeCursorToEnd ().
źródło
Możesz również umieścić kursor na końcu tekstu w
EditText
widoku w następujący sposób:źródło
źródło
To kolejne możliwe rozwiązanie:
Wypróbuj to rozwiązanie, jeśli z jakiegoś powodu nie działa:
źródło
To działa dobrze dla mnie!
źródło
W moim przypadku stworzyłem następujący ext kotlin. funkcja, może być przydatna dla kogoś
Następnie użyj w następujący sposób
źródło
Jeśli Twój EditText nie jest jasny:
lub
źródło
Powinieneś być w stanie to osiągnąć za pomocą
EditText's
metodysetSelection()
, patrz tutajźródło
myślę, że to może osiągnąć to, czego chcesz.
źródło
Pytanie jest stare i udzielono odpowiedzi, ale myślę, że przydatne może być otrzymanie tej odpowiedzi, jeśli chcesz korzystać z nowo wydanych narzędzi DataBinding dla systemu Android, po prostu ustaw to w pliku XML:
źródło
EditText editText = findViewById(R.id.editText); editText.setSelection(editText.getText().length()); // End point
Kursorźródło
Jeśli chcesz zaznaczyć cały tekst i po prostu wpisać nowy tekst zamiast starego, możesz użyć
źródło
To działa
źródło
editText.setSelection
jest magia tutaj. Zasadniczo zaznaczenie umożliwia umieszczenie kursora w dowolnej pozycji.To umieszcza kursor na końcu EditText. Zasadniczo
editText.getText().length()
daje długość tekstu. Następnie używaszsetSelection
z długością.editText.setSelection(0);
Służy do ustawiania kursora w pozycji początkowej (0).
źródło
Wszystkie inne kody, które testowałem, nie działały dobrze, ponieważ użytkownik mógł nadal umieszczać kursor / kursor w dowolnym miejscu w środku łańcucha (np .: 12 | 3,00 - gdzie | jest kursorem). Moje rozwiązanie zawsze umieszcza kursor na końcu łańcucha, gdy tylko dotknie się go w EditText.
Ostatecznym rozwiązaniem jest:
@ ciąg / kwota = „0,00” @ ciąg / wartość_ zero = „0,00”
Mam nadzieję, że to pomoże!
źródło
W przypadku ViewModel, LiveData i powiązania danych
Potrzebowałem tej funkcji
EditText
z obsługą wielu linii w mojej aplikacji do notatek. Chciałem kursor na końcu tekstu, gdy użytkownik przechodzi do fragmentu zawierającego tekst notatki.Rozwiązanie sugerowane przez djleopa jest bliskie. Problem polega jednak na tym, że jeśli użytkownik umieści kursor gdzieś pośrodku tekstu do edycji i zacznie pisać, kursor przeskoczy ponownie na koniec tekstu. Stało się tak, ponieważ
LiveData
wyemitowałyby nową wartość, a kursor ponownie przeskoczyłby na koniec tekstu, powodując, że użytkownik nie byłby w stanie edytować tekstu gdzieś pośrodku.Aby rozwiązać ten problem, używam
MediatorLiveData
i przypisuję mu długośćString
tylko raz za pomocą flagi. Spowoduje to, że LiveData odczyta wartość tylko raz, to znaczy, gdy użytkownik przejdzie do fragmentu. Następnie użytkownik może umieścić kursor w dowolnym miejscu, w którym chce edytować tekst.ViewModel
Oto
yourObject
kolejna funkcja LiveData pobrana z bazy danych zawierającej tekst String, który wyświetlasz wEditText
.Następnie powiąż to
MediatorLiveData
z tekstem edycji za pomocą adaptera wiązania.XML
Używa dwukierunkowego powiązania danych do wyświetlania tekstu oraz akceptowania wprowadzania tekstu.
Adapter do wiązania
Event
klasaTa
Event
klasa jest jak SingleLiveEvent napisany przez Jose Alcérreca z Google. Używam go tutaj, aby zadbać o rotację ekranu. Użycie singlaEvent
sprawi, że kursor nie przeskoczy na koniec tekstu, gdy użytkownik edytuje tekst gdzieś pośrodku, a ekran się obraca. Utrzymuje tę samą pozycję, gdy ekran się obraca.Oto
Event
klasa:To rozwiązanie działa dla mnie i zapewnia dobre wrażenia użytkownika. Mam nadzieję, że pomoże to również w twoich projektach.
źródło
podobna do odpowiedzi @Anh Duy, ale dla mnie to nie zadziałało. Potrzebowałem również kursora, aby przejść do końca tylko wtedy, gdy użytkownik stuknie edytowany tekst i nadal będę mógł wybrać pozycję kursora później, jest to jedyny kod, który działał dla mnie
źródło
Robi to bezpiecznie :
źródło
źródło
Powyższe odpowiedzi nie działały dla mnie. Więc znalazłem nowe rozwiązanie. To może komuś pomóc. Korzystam z najnowszej wersji Androida Studio, tj. 3.5 na dzień dzisiejszy. Może to może być powód, dla którego powyższe odpowiedzi nie wykazały żadnego efektu.
KOD:
Tutaj pierwszy argument jest wartością tekstową Spannable, którą chcesz grać, podczas gdy drugi argument jest wartością indeksu. Ponieważ chcemy, aby kursor znajdował się na końcu tekstu, wzięliśmy getText (). Length (), która zwraca długość tekstu
źródło
Użyj tego pliku CustomEditText w pliku XML, to zadziała. Przetestowałem to i działa dla mnie.
źródło
Jeśli chcesz umieścić kursor na końcu tekstu w widoku EditText
źródło