ubu*_*oid 16 android input android-edittext
我有一个EditTextView,它是由setText()我的代码和用户通过(软/硬)键盘编辑的 - 如果可能的话,通过语音输入.我希望以不同于普通用户输入的方式处理我的代码所做的输入:如果发生用户输入,则应触发内部事件.但我不知道如何区分两者.以前 - 在模拟器上开发时 - 我使用该onKeyDown()方法来捕获用户输入.但是,当在真实设备上进行测试时,我发现,这onKeyDown()不是从软键盘输入触发的.此外,语音输入不会被识别,但我认为这是一个小缺陷.所以这个解决方案对我来说别无选择.
另一方面,有onTextChanged()方法,但这是由两个setText()和键盘输入触发.那么如何区分两者或哪些方法仅由用户输入调用,而不是在使用时setText(),我可以覆盖它吗?
我终于通过实现一个InputConnectionWrapper(参见这个问题,特别是实现示例的答案)解决了这个问题,它有各种方法从软键盘获取输入.我InputConnectionWrapper在方法中返回我的EditText.onCreateInputConnection().对于我使用的硬键盘EditText.onPreIme().所有这些方法都被覆盖并通过我的框架路由它们的输入,框架处理文本输入并相应地更新View.这意味着,在所有这些覆盖的方法(除了onCreateInputConnection())之外,不会调用super方法,因为我自己更新了View.这可以防止我的数据模型和视图之间的不一致.
这里已经有很多好的解决方法了!我想添加对我有用的内容,以便为将来可能遇到此问题的任何人提供选择。
我使用了 TextWatcher,并且仅依赖于在编辑 EditText 时检查当前具有焦点的元素。请注意,如果在您的应用程序中,用户必须在输入文本之前将焦点集中到 EditText(例如通过单击它),并且您确定在使用时另一个元素将获得焦点,那么这将起作用setText。你的代码。
像这样的东西
yourEditText.addTextChangedListener(
new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (yourEditText.hasFocus) {
//this is a user input
}
}
@Override
public void afterTextChanged(Editable s) {
}
}
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5499 次 |
| 最近记录: |