【发布时间】:2017-07-12 18:09:29
【问题描述】:
我一直在尝试使用 EditText 获得特定行为。
这是我启用旋转的简单活动。当我输入一些文字时,
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
【问题讨论】:
-
"...保存在 onInstanceState 中的文本已在 onCreate 方法中设置为 EditText" 我在您的代码中看不到它。
-
@WilliMentzel 由安卓系统设置。我认为该属性称为 freezesText。检查第二个链接
-
请查看更新后的答案。
-
@alexeypolusov EditText 应保留其值,无论是否从 saveInstanceState 中显式检索它。如果我按照您提供的准确运行代码,则在旋转时不会触发 onTextChanged,并且 EditText 的值保持不变(即使在旋转之后)。
-
@alexeypolusov 这就是问题所在,对我来说它不会发生。 API版本?模拟器?
标签: android