Czy istnieje sposób na EditText
prezentację wielu wierszy i użycie etykiety działania IME „Gotowe” w systemie Android 2.3?
W systemie Android 2.2 nie stanowi to problemu, przycisk Enter wyświetla etykietę czynności IME „Gotowe” ( android:imeActionLabel="actionDone"
) i odrzuca wprowadzanie programowe po kliknięciu.
Podczas konfigurowania EditText
wieloliniowego systemu Android 2.3 usuwa możliwość wyświetlania czynności „Gotowe” dla klawiatury programowej.
Udało mi się zmienić zachowanie przycisku wprowadzania miękkiego wprowadzania danych za pomocą a KeyListener
, jednak przycisk enter nadal wygląda jak klawisz Enter.
Oto deklaracja EditText
<EditText
android:id="@+id/Comment"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="0dp"
android:lines="3"
android:maxLines="3"
android:minLines="3"
android:maxLength="60"
android:scrollHorizontally="false"
android:hint="hint"
android:gravity="top|left"
android:textColor="#888"
android:textSize="14dp"
/>
<!-- android:inputType="text" will kill the multiline on 2.3! -->
<!-- android:imeOptions="actionDone" switches to a "t9" like soft input -->
Kiedy sprawdzam inputType
wartość po wczytaniu ustawienia widoku treści w działaniu, to pokazuje się jako:
inputType = 0x20001
Który jest:
- class =
TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
- flagi =
InputType.TYPE_TEXT_FLAG_MULTI_LINE
źródło
EditText
, więc nie ma tego w moim pliku XML aktywności. Próbowałem wprowadzenie tego kodu w mojej działalności, ale mam błąd:The method onCreateInputConnection(EditorInfo) of type SMSMain must override or implement a supertype method
. Dzwoniszsuper
na początku, więc nie wiesz, w czym jest problem. Masz jakieś sugestie? Dzięki.Odpowiedź Ohhoroba jest w zasadzie poprawna, ale jego kod jest naprawdę zbędny! Jest to w zasadzie odpowiednik tej znacznie prostszej wersji (pełny kod dla leniwych czytelników):
package com.example.views; import android.content.Context; import android.util.AttributeSet; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.widget.EditText; // An EditText that lets you use actions ("Done", "Go", etc.) on multi-line edits. public class ActionEditText extends EditText { public ActionEditText(Context context) { super(context); } public ActionEditText(Context context, AttributeSet attrs) { super(context, attrs); } public ActionEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { InputConnection conn = super.onCreateInputConnection(outAttrs); outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION; return conn; } }
Zwróć uwagę, że niektóre
inputType
opcje, takie jaktextShortMessage
sprawiają, że to nie działa! Proponuję zacząć odinputType="text"
. Oto, jak możesz go użyć w swoim XML.<com.example.views.ActionEditText android:id=... android:layout_stuff=... android:imeOptions="actionDone" android:inputType="textAutoCorrect|textCapSentences|textMultiLine" android:maxLines="3" />
źródło
Alternatywnym rozwiązaniem do tworzenia podklas klasy EditText jest skonfigurowanie instancji EditText w następujący sposób:
editText.setHorizontallyScrolling(false); editText.setMaxLines(Integer.MAX_VALUE);
Przynajmniej działa to dla mnie na Androida 4.0. Konfiguruje instancję EditText tak, aby użytkownik edytował jednowierszowy ciąg, który jest wyświetlany z miękkim zawijaniem w wielu wierszach, nawet jeśli jest ustawiona akcja IME.
źródło
Po poprzedniej odpowiedzi
public class MultiLineText extends EditText { public MultiLineText(Context context) { super(context); } public MultiLineText(Context context, AttributeSet attrs) { super(context, attrs); } public MultiLineText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { InputConnection connection = super.onCreateInputConnection(outAttrs); int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION; if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) { // clear the existing action outAttrs.imeOptions ^= imeActions; // set the DONE action outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE; } if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) { outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION; } return connection; } }
Użyj tego jak
<myapp.commun.MultiLineText android:id="@+id/textNotes" android:layout_height="wrap_content" android:minHeight="100dp" android:layout_width="wrap_content" android:hint="Notes" android:textSize="20sp" android:padding="7dp" android:maxLines="4"/>
źródło
aby umieścić akcję Gotowe, możesz użyć:
XML
android:inputType="text|textCapSentences"
JAWA
editText.setHorizontallyScrolling(false); editText.setMaxLines(Integer.MAX_VALUE);
Mam nadzieję, że to zadziała dla Ciebie.
źródło
Najwyraźniej odpowiedź na pierwotne pytanie brzmi: tak, ale wydaje mi się, że zespół Androida stara się skłonić programistów do zastanowienia się nad tym, jak używają wielowierszowego tekstu edycji. Chcą, aby klawisz Enter dodawał nowe linie i prawdopodobnie spodziewają się, że podasz przycisk lub inny środek wejściowy, aby wywołać zdarzenie, które skończyłeś edytować.
Mam ten sam problem i moim oczywistym rozwiązaniem było po prostu dodanie przycisku Gotowe i pozwolenie klawiszowi Enter na dodanie nowych linii.
źródło
Użyj tego atrybutu w swoim pliku XML.
źródło