Ответ 1
У меня была аналогичная проблема, но я вижу ее только при включении автозаполнения для EditText.
Моя работа заключалась в том, чтобы отключить автозаполнение.
<EditText
.
.
.
android:inputType="textMultiLine|textNoSuggestions"
/>
У меня проблема с элементом управления EditText. Эта проблема происходит только в этом конкретном действии и других действиях с EditTexts. Я удалил все вызовы setText для этого EditText, и проблема все еще сохраняется.
Я запускаю Android 2.3.4 на своем мобильном устройстве. Это Nexus S и работает под управлением Android. В эмуляторе (под управлением Android 2.2) эта проблема не возникает.
Когда я поворачиваю телефон, Android автоматически заменяет текст, который был в EditText перед вращением. Я не использую savedInstanceState, чтобы что-то делать. Android делает это сам.
Моя проблема:
Предположим, что слово "тест" находится в EditText. Когда я поворачиваю телефон, Android поместит "testtest" в EditText, когда активность будет воссоздана. Этот только происходит, когда я использую виртуальную клавиатуру для ввода в EditText, я не нажимаю кнопку "done" на виртуальной клавиатуре, я нажимаю, чтобы удалить виртуальную клавиатуру, и затем поворачиваю устройство. Если я использую кнопку "Готово" вместо кнопки "Назад", проблема не возникает.
Любые идеи? Как я уже сказал, я НЕ настраиваю текст. Все строки, вызывающие setText, были прокомментированы.
Обновление 1: я прокомментировал все в этой операции, кроме метода onCreate(). Проблема все еще возникает.
Обновление 2: я создал новое действие. Эта новая активность имеет только метод onCreate(). Единственное, что в методе onCreate() - вызов setContentView (использует тот же файл макета) и вызов super onCreate(). Проблема по-прежнему сохраняется. Я в тупике. Единственное, что я могу догадаться, - это что-то странное с файлом макета. Я понятия не имею, что это будет.
Обновление 3: я удалил все из макета, кроме EditText. Проблема все еще возникает.
У меня была аналогичная проблема, но я вижу ее только при включении автозаполнения для EditText.
Моя работа заключалась в том, чтобы отключить автозаполнение.
<EditText
.
.
.
android:inputType="textMultiLine|textNoSuggestions"
/>
Я придумал обход, который вы могли бы попробовать. Он работает путем подклассификации EditText, захватывает пару событий, а затем принимает только текстовые изменения, которые появляются при отображении клавиатуры, что должно отфильтровывать любые изменения, которые пользователь не набрал. Я до сих пор не знаю, что может быть причиной этого.
static class CustomEditText extends EditText{
boolean keyboardHidden = true;
String mText = null;
public CustomEditText(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public CustomEditText(Context context, AttributeSet attr) {
super(context, attr);
// TODO Auto-generated constructor stub
}
//This gets called for any text field change, regardless of where the change comes from
//When the phone flips and tries to double the text we can catch it.
//If the keyboard is hidden (meaning the user isn't typing anything) the strings should match
protected void onTextChanged(CharSequence text, int start, int before, int after){
if(keyboardHidden && mText!=null && !text.toString().equals(mText)){
setText(mText);
setSelection(mText.length());
}
else
mText = text.toString();
}
//There no way right now to directly check if the soft keyboard is displayed
//On touch, the soft keyboard is displayed by default for EditText, so assume the keyboard is displayed from this point on
public boolean onTouchEvent(MotionEvent event){
keyboardHidden = false;
super.onTouchEvent(event);
return true;
}
//On a back press we're removing the soft keyboard so set the flag back to true
public boolean dispatchKeyEventPreIme(KeyEvent event){
if(event.getKeyCode() == KeyEvent.KEYCODE_BACK){
keyboardHidden = true;
}
return super.dispatchKeyEvent(event);
}
}
Чтобы обрабатывать изменения вращения, добавьте свой манифест android:configChanges
:
<activity
android:name="yourActivity"
android:configChanges="orientation"></activity>