我一直试图通过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
3 回答
如果已将输入的文本保存在savedInstanceState中,则只需检查是否已保存变量,并根据该条件从中获取值并将其设置为edittext . 无论多少次调用一些方法 . :D问题解决了 .
看一下this,特别是在:
无论如何,你可以在this回答athor中压制
onTextChanged()
:if(ignoreNextTextChange){
ignoreNextTextChange = false;
返回;
}
}
@覆盖
public void beforeTextChanged(CharSequence s,int start,int count,int after){
}
@覆盖
public void afterTextChanged(Editable s){
}};
所以,问题出在设备上 . 其他设备(如Nexus 5X)未显示任何问题,代码按预期工作 .