Android EditText с переносом слов, но без твердых возвратов
Если я устанавливаю SingleLine = true на виджет EditText, я получаю однострочный элемент управления, который не позволяет жестким возвратам вставляться пользователем (нажатие Enter переходит к следующему полю вместо того, чтобы вставлять новую строку), Если я не устанавливаю SingleLine = true, пользователь может вставлять твердые возвраты.
Если я установил layout_height = "wrap_content", элемент управления EditText будет расти вертикально, чтобы отобразить весь текст. Однако он делает это только в том случае, если для SingleLine не установлено значение true.
Итак, мой вопрос в том, можно ли обернуть слово и вертикальное изменение размера, не позволяя пользователю вводить жесткие разрывы строк? Думаю, я мог бы поймать нажатие клавиши ввода, но тогда мне также пришлось бы поймать другие способы, чтобы они могли туда попасть (скопировать/вставить, не знаете, что еще?). Есть ли простой способ сделать это с помощью только правой комбинации свойств?
Я предпочитаю слово-wrap, где пользователь может видеть весь текст по сравнению с горизонтальной прокруткой однострочного элемента управления редактированием, но я действительно не хочу, чтобы они думали, что могут вводить многострочный текст (и я я не хочу поддерживать его). Я думаю, что я могу просто преобразовать твердые возвращения в пробелы, когда я сохраняю данные в своей базе данных, если мне нужно (унаследованное приложение я синхронизирую эти данные, чтобы на ПК не справлялся с жесткими результатами).
Ответы
Ответ 1
Я тоже искал что-то для этого. Единственным решением, которое я нашел, было расширение EditText следующим образом:
package com.kylemilligan.test;
import android.content.Context;
import android.util.AttributeSet;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.EditText;
public class NoNewlineEditText extends EditText
{
public NoNewlineEditText(Context context) {
super(context);
}
public NoNewlineEditText(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
}
@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;
}
}
А затем в XML используйте как:
<com.kylemilligan.test.NoNewlineEditText
android:id="@+id/noNewLineText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top|left"
android:imeOptions="actionDone"
android:minLines="5" />
Надеюсь, это поможет!
Ответ 2
Мне это было интересно, и понял, что встроенное приложение для обмена сообщениями Android обернуло текст без клавиши ввода на мягкой клавиатуре. Согласно исходному макету здесь, это делается со следующими параметрами. Не все необходимы; Я считаю, что ключ должен иметь textShortMessage
, textMultiLine
и flagNoEnterAction
:
android:inputType="textShortMessage|textAutoCorrect|textCapSentences|textMultiLine"
android:imeOptions="actionSend|flagNoEnterAction"
Ответ 3
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
//This will treat Enter as Done instead of new line:
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
And in XML:
android:inputType="textMultiLine"