首页 文章

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

提问于
浏览
2

我一直试图通过EditText获得特定的行为 . 这是我启用旋转的简单活动 . 当我输入一些文本时,会触发 onTextChanged 方法 .

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

但是,当我将手机旋转回原来的方向时,方法再次触发!请参阅本文末尾的logcat .

This is a copy and paste code from a newly created Android Studio project.

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

            }
        });
    }
}

UPD:

Android retains text in all editText fields (with unique ID) on each orientation change by default. That is why onTextChanged is triggered when I rotate my phone. To avoid this I placed onTextChanged listener after onCreate, so it will listen events after text is set to EditText. But it does NOT WORK as expected(logcat). Check the last link for more info

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

3 回答

  • 0

    如果已将输入的文本保存在savedInstanceState中,则只需检查是否已保存变量,并根据该条件从中获取值并将其设置为edittext . 无论多少次调用一些方法 . :D问题解决了 .

  • 0

    看一下this,特别是在:

    您可以注意到,第一个EditText(带ID)中的文本在方向更改后将保持不变,并且还将调用TextChangedListener的onTextChanged()方法来更新TextView . 另一方面,当方向改变时,第二个EditText(未分配ID)将清空为空 .

    无论如何,你可以在this回答athor中压制 onTextChanged()

    ...您可以通过以下任一方式绕过它:在设置文本之前删除TextWatcher,然后再将其添加回来 . 或者在设置文本之前设置一个布尔标志,告诉TextWatcher忽略它 . 例如 . boolean ignoreNextTextChange = true; ((的EditText)
    findViewById(R.id.MyEditText))的setText( “你好”) .
    在你的TextWatcher中:new TextWatcher(){
    @覆盖
    public void onTextChanged(CharSequence s,int start,int before,int count){
    / *
    如果该标志设置为忽略下一个文本更改,
    重置标志,并返回而不做任何事情 .

    • /
      if(ignoreNextTextChange){
      ignoreNextTextChange = false;
      返回;
      }
      }

    @覆盖
    public void beforeTextChanged(CharSequence s,int start,int count,int after){

    }

    @覆盖
    public void afterTextChanged(Editable s){

    }};

  • 0

    所以,问题出在设备上 . 其他设备(如Nexus 5X)未显示任何问题,代码按预期工作 .

相关问题