Android EditText: Выполнено вместо ввода или Word Wrap вместо Multi Line
У меня есть несколько строк EditText, которые не позволяют возвращать строки. Прямо сейчас я заменяю возвраты с некоторыми пробелами, как только они нажимают save. Есть ли способ заменить кнопку ввода на экране кнопкой "Готово"? (например, для одной строки 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" />
Ответы
Ответ 1
android:inputType="textEmailAddress|textEmailSubject"
Вам нужно установить тип ввода как адрес электронной почты или тему электронной почты. Любой из них даст вам желаемый результат. shouldAdvanceFocusOnEnter()
- частный метод в TextView, который определяет, следует ли вводить новую строку или перемещать фокус в следующее поле.
Ответ 2
Я предлагаю прочитать эту статью
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
}
}
Ответ 3
Если вы используете android:inputType="textMultiLine|..."
в своем XML или используете соответствующий код Java:
editField.setInputType(
InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE);
тогда единственное решение для отображения кнопки ✔︎ Done или 🔍 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
Я делаю это для многострочных текстов с помощью actionLabel:
editText.setSingleLine(true);
editText.setLines(10);
editText.setHorizontallyScrolling(false);
editText.setImeActionLabel(getString(R.string.ready), 0);