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

时间:2018-03-23 06:18:03

标签: android

目前,我需要在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() {} }); } } 中捕获最终出现的文字。

这是我的简单代码。

MainActivity.java

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

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

    android:inputType="textMultiLine|textNoSuggestions"

    android:imeOptions="actionSend" />

activity_main.xml中

afterTextChanged

以下是它的表现。

当没有拼写建议时

enter image description here

按ENTER键时

enter image description here

>>>123 456<<< 正在使用以下输出触发一次时间。

afterTextChanged

当有拼写建议时

enter image description here

按ENTER键时

enter image description here

>>>def<<< >>><<< >>>abc <<< >>>abc def<<< 正在使用以下输出触发多次时间。

abc\ndef

我对中间的中间文字不感兴趣。我只对最终文本感兴趣(@Override public void afterTextChanged(Editable editable) { if (isFinalText(edittable.toString())) { doSomething(editable.toString()); } }

我有可能拥有像

这样的东西
EditText

没有关闭拼写建议。

P / S

我不介意扩展dispatchKeyEvent,并在其中进行一些黑客攻击。但是,我曾尝试覆盖onKeyPreIme中的EditTextonEditorAction。不确定为什么他们没有被召唤。

P / S / S

我也尝试使用https://stackoverflow.com/a/8063533/72437中讨论的EditText技术,因为我的System.Diagnostics.Process.GetCurrentProcess().Threads.Count 是多行的,所以我的情况不适用。

2 个答案:

答案 0 :(得分:0)

最后我得出结论:

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

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

答案 1 :(得分:0)

这是解决我面临的问题的正确解决方案。关键是使用

editText.post

解决方案

public class MainActivity extends AppCompatActivity {

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

        final 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(final Editable editable) {
                final String originalString = editable.toString();

                editText.post(new Runnable() {
                    @Override
                    public void run() {
                        String text = editText.getText().toString();
                        if (text.equals(originalString)) {
                            Log.i("CHEOK", originalString);
                        }
                    }
                });
            }
        });
    }
}

这个想法是,当执行时间发布函数时,editText.getText()正在返回一个完整的文本(abc\ndef

添加if (text.equals(originalString)),忽略两个中间文本(defabc\n