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


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

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

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

buttonLayout 是我的UI上的一个简单按钮。
如何提取用户写的内容(不使用 EditText 田野或者隐藏着 EditText)所以用户无法看到或点击它?


5474
2018-02-23 01:46


起源

对我来说听起来像个键盘记录器:D - Willi Mentzel


答案:


我也面临同样的问题。如果我隐藏编辑文本, 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() 给我用键盘输入的文字。


3
2018-02-27 05:48





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

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

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

我看看 InputConnection 由...返回 EditText 尽可能多地分类并复制它。


5
2018-02-23 01:53



我能把它传给一个看不见的人 EditText? - J_Strauton
没试过。大概。 - Gabe Sechan


我会给你一个简单而简短的技巧,我已经测试并且工作得非常好


创建一个 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          
    }
});

2
2018-03-01 04:41