gpt4 book ai didi

android - 即使在 onCreate 方法之后设置了 TextWatcher,也会在 orientationChange 上触发 OnTextChanged

转载 作者:太空狗 更新时间:2023-10-29 13:52:16 24 4
gpt4 key购买 nike

我一直在尝试使用 EditText 获得特定的行为。这是我启用旋转的简单 Activity 。当我输入一些文字时,onTextChanged 方法被触发。

当我旋转手机时,不应触发此方法,因为保存在 onInstanceState 中的文本已经设置到 onCreate< 中的 EditText 方法。

但是,当我将手机旋转回原来的方向时,方法再次触发!请参阅本文末尾的 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) {

}
});
}
}

更新:

默认情况下,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

相关: TextWatcher called even if text is set before adding the watcher

Android retain callback state after configuration change

最佳答案

看看this行动,尤其是在:

You can notice that the text in the first EditText (with ID) will keep no change after orientation changed, and onTextChanged() method of the TextChangedListener will be called also, to update the TextView.

On the other hand, the second EditText (without ID assigned) will clear to empty when orientation changed.

无论如何,您可以像 this 中那样抑制 onTextChanged() athor的答案:

...you can get around it by either:

  • Removing the TextWatcher before you set the text, and adding it back after.
  • Or set a boolean flag before you set the text, which tells the TextWatcher to ignore it.

E.g.

boolean ignoreNextTextChange = true; ((EditText)
findViewById(R.id.MyEditText)).setText("Hello");

And in your TextWatcher:

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) {

} });

关于android - 即使在 onCreate 方法之后设置了 TextWatcher,也会在 orientationChange 上触发 OnTextChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45035804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com