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

nut*_*ter 6 android

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

当我旋转手机,这种方法不应该被触发,bacause的文字,这是保存在onInstanceState已被设置为EditTextonCreate法。

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

相关: 即使在添加观察者之前设置了文本,也会调用 TextWatcher

配置更改后Android保留回调状态

And*_*nko 2

看看这篇文章,尤其是:

您可以注意到,第一个文本EditText(带有 ID)在方向更改后将保持不变,并且还将调用 的onTextChanged()方法 来更新.TextChangedListenerTextView

另一方面,EditText当方向改变时,第二个(未分配 ID)将清空。

不管怎样,你可以onTextChanged()作者的这个回答一样抑制:

...您可以通过以下任一方式解决它:

  • 在设置文本之前删除 TextWatcher,然后再将其添加回来。
  • 或者在设置文本之前设置一个布尔标志,告诉 TextWatcher 忽略它。

例如

boolean ignoreNextTextChange = true; ((EditText)
findViewById(R.id.MyEditText)).setText("Hello");
Run Code Online (Sandbox Code Playgroud)

在你的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) {

     } });
Run Code Online (Sandbox Code Playgroud)