我一直在尝试使用 EditText 获得特定行为。这是我启用旋转的简单活动。当我输入一些文本时,
onTextChanged方法被触发。
当我旋转手机,这种方法不应该被触发,bacause的文字,这是保存在onInstanceState已被设置为EditText在onCreate法。
但是,当我将手机旋转回原来的方向时,方法再次触发!请参阅本文末尾的 logcat。
这是来自新创建的 Android Studio 项目的复制和粘贴代码。
public class MainActivity extends AppCompatActivity {
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.search_query);
}
@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
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) {
Log.d("MainActivity", "charSequence:" + charSequence);
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
默认情况下,Android 会在每次方向更改时保留所有 editText 字段(具有唯一 ID)中的文本。这就是为什么当我旋转手机时会触发 onTextChanged 的原因。为了避免这种情况,我在 onCreate 之后放置了 onTextChanged 侦听器,因此它会在文本设置为 EditText 后侦听事件。但它没有按预期工作(logcat)。查看最后一个链接以获取更多信息
日志猫:
D/MainActivity: onCreate
D/MainActivity: charSequence:a //entered manually
D/MainActivity: charSequence:a // triggered on orientation change
D/MainActivity: onDestroy
D/MainActivity: onCreate
D/MainActivity: onDestroy
D/MainActivity: onCreate
D/MainActivity: onDestroy
D/MainActivity: onCreate
D/MainActivity: onDestroy // no callback so far
D/MainActivity: onCreate
D/MainActivity: charSequence:ba // entered manyally
D/MainActivity: onDestroy
D/MainActivity: onCreate
D/MainActivity: charSequence:ba // when came back to original "ba" orientation
D/MainActivity: onDestroy
D/MainActivity: onCreate
Run Code Online (Sandbox Code Playgroud)
看看这篇文章,尤其是:
您可以注意到,第一个文本
EditText(带有 ID)在方向更改后将保持不变,并且还将调用 的onTextChanged()方法 来更新.TextChangedListenerTextView另一方面,
EditText当方向改变时,第二个(未分配 ID)将清空。
不管怎样,你可以onTextChanged()像作者的这个回答一样抑制:
...您可以通过以下任一方式解决它:
- 在设置文本之前删除 TextWatcher,然后再将其添加回来。
- 或者在设置文本之前设置一个布尔标志,告诉 TextWatcher 忽略它。
例如
Run Code Online (Sandbox Code Playgroud)boolean ignoreNextTextChange = true; ((EditText) findViewById(R.id.MyEditText)).setText("Hello");在你的
TextWatcher:Run Code Online (Sandbox Code Playgroud)new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { /* If the flag is set to ignore the next text change, reset the flag, and return without doing anything. */ if (ignoreNextTextChange){ ignoreNextTextChange = false; return; } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } });
| 归档时间: |
|
| 查看次数: |
1348 次 |
| 最近记录: |