Как получить входной текст с мягкой клавиатуры
Я запускаю мягкую клавиатуру следующим образом:
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(buttonLayout.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
buttonLayout
- простая кнопка в моем пользовательском интерфейсе.
Как извлечь то, что написал пользователь (не используя поле EditText
или, возможно, скрывая EditText
), чтобы пользователь не мог его увидеть или щелкнуть?
Ответы
Ответ 1
Я также столкнулся с такой же проблемой. если я скрываю текст редактирования, edtTxt.getText().toString()
всегда пуст. поэтому я держался как
<EditText
android:id="@+id/edtTxt"
android:layout_width="0px"
android:layout_height="0px" />
Так что пользователь не может этого видеть. и при нажатии кнопки
edtTxt.requestFocus();
edtTxt.setText("");
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(edtTxt.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED,
0);
Теперь edtTxt.getText().toString()
текст, который я набрал с помощью клавиатуры.
Ответ 2
Без EditText вам будет трудно.
Необходимо подключить InputMethod к представлению. Независимо от того, какой вид вы используете, вам нужно переопределить onCreateInputConnection
, чтобы вернуть пользовательский объект InputConnection
, который как минимум реализует commitText (для ввода слов), deleteSurroundingText
(для удаления) и sendKeyEvent
(для клавиатур, которые предполагают вас "в немой" ) и все функции завершения. Входные соединения - это сложные вещи, и вы испортите сторонние клавиатуры, такие как Swiftkey и Swype, если вы не поняли это правильно. Я действительно не предлагаю это делать.
Если вы хотите сделать это, у вас есть все шансы получить правильное решение - заявить, что ваше окно - это тип ввода TYPE_NULL
. Большинство клавиатур затуманиваются и предполагают, что вы принимаете только самые простые команды в этом режиме. Но вы не можете рассчитывать на это.
Я бы посмотрел на InputConnection
, возвращаемый классом EditText
, и скопировал как можно больше.
Ответ 3
Я дам вам простой и короткий трюк, который я тестировал и работаю очень хорошо
Создайте ширину EditText
с высотой 0dp
и шириной 0dp
, чтобы пользователь не увидел EditText
даже там, где это было видно.
<EditText
android:id="@+id/editText"
android:layout_width="0dp"
android:layout_height="0dp"
/>
Когда нажата кнопка, запросите фокус на EditText
и откройте клавиатуру как свой собственный путь
buttonLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editText.requestFocus();
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
}
});
Затем добавьте TextWatcher()
в EditText
, и вы можете сделать этот EditText
невидимым в методе beforeTextChanged
, он необязательный. Ваш TextWatcher
выглядит следующим образом
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
editText.setVisibility(View.INVISIBLE); //Optional
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
myString = editText.getText().toString(); //Here you will get what you want
}
});