【发布时间】:2018-03-23 06:18:03
【问题描述】:
目前,我需要在EditText 中捕获最终出现的文本。
这是我的简单代码。
MainActivity.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 时
afterTextChanged 被触发 一次 次,输出如下。
>>>123
456<<<
有拼写建议时
当我按下 ENTER 时
afterTextChanged 被触发多次次,输出如下。
>>>def<<<
>>><<<
>>>abc
<<<
>>>abc
def<<<
我对中间的中间文本不感兴趣。我只对最终文本感兴趣(abc\ndef)
我怎么可能有类似的东西
@Override
public void afterTextChanged(Editable editable) {
if (isFinalText(edittable.toString())) {
doSomething(editable.toString());
}
}
不关闭拼写建议。
P/S
我不介意扩展EditText,并在其中进行一些黑客攻击。但是,我试图在EditText 中覆盖dispatchKeyEvent 和onKeyPreIme。不知道为什么他们没有被调用。
P/S/S
我也在尝试onEditorAction 中讨论的https://stackoverflow.com/a/8063533/72437 技术,它不适用于我的情况,因为我的EditText 是多行的。
【问题讨论】:
-
我认为你不能,而且对于不同的键盘,你会得到不同的中间状态。唯一的出路是在文本更改后取消注册文本观察器。设置您的文本,然后再次注册 textwatcher
标签: android