Подтвердить что ты не робот

EditText удваивается при вращении

У меня проблема с элементом управления 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. Проблема все еще возникает.

4b9b3361

Ответ 1

У меня была аналогичная проблема, но я вижу ее только при включении автозаполнения для EditText.

Моя работа заключалась в том, чтобы отключить автозаполнение. <EditText . . . android:inputType="textMultiLine|textNoSuggestions" />

Ответ 2

Я придумал обход, который вы могли бы попробовать. Он работает путем подклассификации 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);
    }   

}

Ответ 3

Чтобы обрабатывать изменения вращения, добавьте свой манифест android:configChanges:

        <activity

        android:name="yourActivity"
        android:configChanges="orientation"></activity>