Czy można mieć EditText
widżet z android:inputType="textMultiLine"
zestawem, a android:imeOptions="actionDone"
jednocześnie?
Chciałbym mieć wielowierszowe pole edycji z przyciskiem akcji na klawiaturze do wykonania, a nie Enter (powrót karetki), ale wygląda na to, że nie działa.
Z góry dziękuję
Odpowiedzi:
Posługiwać się
iw XML:
źródło
textField.setCursorVisible(false);
wewnątrzonEditorActionListener
Z dokumentacji systemu Android: ' "textMultiLine" Normalna klawiatura tekstowa, która umożliwia użytkownikom wprowadzanie długich ciągów tekstu zawierających znaki końca wiersza (powrót karetki) . Dlatego atrybut textMultiLine nie jest odpowiedni, jeśli chcesz mieć przycisk „Gotowe” na klawiaturze.
Prostym sposobem uzyskania wielowierszowego (w tym przypadku 3 wierszy) pola wejściowego za pomocą przycisku Gotowe jest użycie EditText z
Jednak z jakiegoś powodu działa to tylko wtedy, gdy dokonam tych ustawień w kodzie zamiast w pliku układu (w onCreate) przez
Mam nadzieję, że to komuś pomoże, ponieważ ustalenie tego zajęło trochę czasu. Jeśli znajdziesz sposób, aby to zadziałało z manifestu, daj nam znać.
źródło
maxLines()
zamiast,setLines()
jeśli chcesz uniknąć zmiany wysokościEditText
setMaxLines(3)
) Wielkie dzięki!Przykład roboczy! Utwórz poniższą niestandardową klasę EditText, która obsługuje tę funkcję i użyj tej klasy w pliku xml. Kod roboczy:
źródło
Aby to zrobić w Kotlin (a także opcjonalnie zastosuj inne konfiguracje, takie jak
textCapSentences
możesz użyć tej funkcji rozszerzenia:Stosowanie:
źródło
setRawInputType
zamiastsetInputType
Myślę, że to jest sposób na zrobienie tego. Posiadanie sprawia
android:inputType="textMultiLine"
,android:imeOptions="actionDone"
że funkcjonalność klawisza enter jest niejednoznaczna. Pamiętaj tylko, że możesz użyćandroid:lines="10"
i być może usunąćandroid:inputType="textMultiLine"
, ale zależy to od tego, co chcesz osiągnąć, czasami po prostu potrzebujeszandroid:inputType="textMultiLine"
i nie ma dla niego zamiennika.źródło
Wydaje mi się, że to działa doskonale
źródło
Wielokrotnego użytku rozwiązanie Kotlin
Ustawienie tych wartości w kodzie było jedyną rzeczą, która działała dla mnie
Często tego potrzebuję, więc zrobiłem to, aby kod był czysty:
Jeśli chcesz dodać opcjonalne działanie niestandardowe do „Gotowe”, spróbuj tego:
Następnie dodaj
hideKeyboard()
połączenieEditText.multilineDone
źródło
Krótka odpowiedź: nie, uważam, że nie jest to możliwe przed API na poziomie 11 (3.0).
Ten sam problem pojawił się tutaj (omawiany w komentarzach do zaakceptowanej odpowiedzi):
Przycisk akcji klawiatury Android Soft
Od ostatniego komentarza:
źródło
Prosty sposób na obejście tej sytuacji:
zachowaj te atrybuty w EditText:
następnie dodaj ten kod, aby ukryć klawiaturę tylko po naciśnięciu klawisza ENTER:
źródło
Jeśli nie chodzi o wygląd klawiatury ekranowej, możesz po prostu umieścić na klawiaturze odbiornik wejścia i uruchomić stan „gotowe”, jeśli użytkownik wprowadzi znak nowej linii.
źródło
jeśli użyjesz opcji tekstowej textImeMultiline z opcją imeoptions flagnext i actionnext, otrzymasz następny przycisk zamiast powrotu kariagu
źródło
Podczas gdy żadne z innych rozwiązań nigdy dla mnie nie działało, poniższe działały pięknie i zaoszczędziły mi dni i dni więcej googlowania, oczywiście z kilkoma własnymi zwrotami akcji. Niestety nie pamiętam, skąd dokładnie otrzymałem kod, więc nie mogę przyznać autorowi kredytu, na który zasługuje.
W Twoim kodzie Java:
źródło
Jestem na 4.x i próbowałem wywołać setHorizontallyScrolling () (z lub bez setLine () lub setMaxLines ()), a także wiele różnych konfiguracji XML, aby wyświetlić przycisk Gotowe. Żaden z nich nie działał. Najważniejsze jest to, że jeśli Twój EditText jest wielowierszowy, Android zawsze będzie chciał pokazać powrót karetki zamiast przycisku „Gotowe”, chyba że dodasz trochę hackowania.
Najmniej skomplikowane rozwiązanie, które znalazłem, które nie wymaga ponownego odwzorowania zachowania powrotu karetki, jest tutaj: https://stackoverflow.com/a/12570003/3268329 . To rozwiązanie zniweczy nieustającą chęć Androida do wymuszenia ustawienia flagi IME_FLAG_NO_ENTER_ACTION dla widoków wieloliniowych, co powoduje zniknięcie przycisku Gotowe.
źródło
Przez jakiś czas też walczyłem, ale w końcu znalazłem rozwiązanie!
Po prostu utwórz własną klasę EditText jako taką:
Ta klasa usuwa lineBreaks (\ n), zawija tekst tak, jak zrobiłoby to textMultiline, ORAZ pozwala zastąpić przycisk Enter przez ImeAction;).
Wystarczy wywołać to w swoim XML zamiast klasycznej klasy EditText.
Aby wyjaśnić logikę tutaj:
źródło
Działające rozwiązanie jest tutaj, utwórz niestandardowy widok EditTextView (po prostu rozszerz widok tekstu) i nadpisz onInputConnection fragmentem kodu, który znajdziesz w zaakceptowanej odpowiedzi tutaj: Wielowierszowy tekst edycji z etykietą akcji Done SoftInput w wersji 2.3
źródło