如何从软键盘获取输入文本

时间:2016-02-23 01:46:52

标签: java android

我正在推出这样的软键盘:

InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

inputMethodManager.toggleSoftInputFromWindow(buttonLayout.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

buttonLayout是我的UI上的一个简单按钮。
如何提取用户写的内容(不使用EditText字段或隐藏EditText),以便用户无法查看或点击它?

3 个答案:

答案 0 :(得分:5)

如果没有EditText,你将会遇到困难。

需要将InputMethod连接到视图。无论使用哪种视图,都需要覆盖onCreateInputConnection以返回自定义InputConnection对象,该对象至少实现commitText(用于单词输入),deleteSurroundingText(用于删除)和{{1 (对于假设你处于哑模式的键盘)和所有完成功能。输入连接是复杂的事情,如果你没有把它搞定,你会搞砸第三方键盘如Swiftkey和Swype。我真的不建议这样做。

如果您想这样做,最好的机会就是宣称您的窗口是sendKeyEvent输入类型。大多数键盘都会自行愚蠢,并假设您只接受该模式下最简单的命令。但你不能指望它。

我会查看TYPE_NULL类返回的InputConnection并尽可能多地复制它。

答案 1 :(得分:3)

我也面临同样的问题。如果我隐藏编辑文本,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 :(得分:2)

我会给你一个简单的&amp;简短的技巧,我测试过并且工作得很好

创建一个EditText高度为0dp且宽度为0dp的{​​{1}},这样用户就不会看到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          
    }
});