Как получить входной текст с мягкой клавиатуры

Я запускаю мягкую клавиатуру следующим образом:

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