android - 如何接收带有拼写建议的 EditText 的最终 afterTextChanged 事件(不关闭)

标签 android

目前,我需要在 EditText 中捕获最终出现的文本。

这是我的简单代码。

主 Activity .java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = findViewById(R.id.edit_text);

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
                Log.i("CHEOK", ">>>" + editable.toString() + "<<<");
                doSomething(editable.toString());
            }

            private void doSomething() {}
        });
    }
}

activity_main.xml

<EditText
    android:id="@+id/edit_text"

    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:inputType="textMultiLine|textNoSuggestions"

    android:imeOptions="actionSend" />

这是它的行为方式。

没有拼写建议时

enter image description here

当我按下 ENTER 时

enter image description here

afterTextChanged 被触发一次,输出如下。

>>>123
456<<<

有拼写建议时

enter image description here

当我按下 ENTER 时

enter image description here

afterTextChanged多次 触发,输出如下。

>>>def<<<
>>><<<
>>>abc
<<<
>>>abc
def<<<

我对中间的中间文本不感兴趣。我只对最终文本感兴趣(abc\ndef)

我怎么可能有这样的东西

@Override
public void afterTextChanged(Editable editable) {
    if (isFinalText(edittable.toString())) {
        doSomething(editable.toString());
    }
}

不关闭拼写建议。

P/S

我不介意扩展 EditText,并在其中进行一些修改。但是,我曾尝试在 EditText 中覆盖 dispatchKeyEventonKeyPreIme。不确定为什么他们没有被调用。

P/S/S

我也在尝试 https://stackoverflow.com/a/8063533/72437 中讨论的 onEditorAction 技术 它不适用于我的情况,因为我的 EditText 是多行的。

最佳答案

最后我得出结论:

editText.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) {
        }

        @Override
        public void afterTextChanged(Editable s) {
            if (prevString.length() >= s.length()) {
                if (userIsInteracting) {
                    doSomething(s.toString());
                }
            } else {
                doSomething(s.toString());
            }
            prevString = s.toString();
        }
    });
 editText.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_DEL)
                    userIsInteracting = true;
                Log.d("key event", keyCode + event.toString());
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        userIsInteracting = false;
                    }
                }, 1000);
                return false;
            }
        });

请尝试一下,它肯定会起作用。我尝试并完美地工作。 快乐编码!!!

关于android - 如何接收带有拼写建议的 EditText 的最终 afterTextChanged 事件(不关闭),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49443496/

相关文章:

java - 如何将特定日志写入txt文件

Android MediaPlayer 崩溃的应用程序

php - 如何检测 Android 应用程序的卸载并从服务器中删除相关用户的数据?

java - Android:在两个线程之间共享列表

android - 通过 JSON 在 android 中作为 ListView 的 Mysql 查询结果

android - 如何使用 Room 和 RxJava 插入数据?

java - 经纬度 : Check whether a given point of LatLng is within a 5km radius of another point

安卓 GCM : Not getting registration token on onCreate() method

android - 如何在 AutoCompleteTextView 的回收站 View 中显示数据列表

java - 是否可以将数据库文件复制到SD卡?