Android EditText: выполнено вместо ввода или перенос слов вместо многострочного - PullRequest
15 голосов
/ 03 марта 2011

У меня есть многострочный EditText, который не разрешает возврат строки. Прямо сейчас я заменяю возвраты пробелами, как только они нажимают «Сохранить». Можно ли заменить экранную кнопку ввода кнопкой Готово? (как для однострочного EditText)

Я знаю, что мне все равно следует вырезать возвраты (\r\n|\r|\n), потому что экранная клавиатура - не единственный способ добавить их.

Вот мой текущий XML

<EditText android:layout_width="fill_parent" android:layout_height="wrap_content"
          android:minLines="3" android:gravity="left|top"
          android:inputType="textMultiLine|textAutoCorrect|textCapSentences"
          android:imeOptions="actionDone" />

Ответы [ 4 ]

26 голосов
/ 12 сентября 2011

Предлагаю прочитать эту статью

http://savagelook.com/blog/android/android-quick-tip-edittext-with-done-button-that-closes-the-keyboard

действительно хороший пример

XML:

<EditText 
    android:id="@+id/edittext_done"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Enter some text"
    android:imeOptions="actionDone"
    />

Класс пользовательских действий:

class DoneOnEditorActionListener implements OnEditorActionListener {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
            return true;  
        }
        return false;
    }
}

Класс деятельности:

public class SampleActivity extends Activity {    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_activity_layout); // sample_activity_layout contains our target EditText, target_edittext

        EditText targetEditText = (EditText)findViewById(R.id.target_edittext); 
        targetEditText.setOnEditorActionListener(new DoneOnEditorActionListener());

        // The rest of the onCreate() code
   }
}
20 голосов
/ 03 марта 2011
android:inputType="textEmailAddress|textEmailSubject"

Вам необходимо установить тип ввода в качестве адреса электронной почты или темы сообщения.Любой из них даст вам желаемый результат.shouldAdvanceFocusOnEnter() - это закрытый метод в TextView, который определяет, вводить ли новую строку или перемещать фокус на следующее поле.

5 голосов
/ 08 декабря 2011

Если вы используете android:inputType="textMultiLine|..." в своем XML или используете соответствующий код Java:

editField.setInputType(
    InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE);

, тогда единственное решение для отображения ✔︎ Готово или * 1007Кнопка ? Search предназначена для ответов на следующие вопросы:

Многострочный EditText с меткой действия Done SoftInput на 2.3

Таким образом, вы должны расширить EditText и переопределитьonCreateInputConnection() для ручной установки флагов IME_ACTION_xx;что-то вроде этого ...

@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;
}

Это потому, что всякий раз, когда вы включаете опцию "textMultiLine", она игнорирует любую настройку android:imeOptions="actionDone" или android:imeActionLabel="actionDone", что очень странно и сбивает с толку.

4 голосов
/ 06 марта 2015

Я делаю это для многострочных текстов с помощью actionLabel:

editText.setSingleLine(true);
editText.setLines(10);
editText.setHorizontallyScrolling(false);
editText.setImeActionLabel(getString(R.string.ready), 0);
...