EditText удваивается при повороте - PullRequest
25 голосов
/ 15 мая 2011

У меня проблема с элементом управления EditText. Эта проблема возникает только в этом конкретном действии, а не в других действиях с EditTexts. Я удалил все вызовы setText для этого EditText, и проблема все еще сохраняется.

Я использую Android 2.3.4 на своем мобильном устройстве. Это Nexus S и работающий на складе Android. В эмуляторе (под управлением Android 2.2) эта проблема не возникает.

Когда я поворачиваю телефон, Android автоматически заменяет текст, который был в EditText до поворота. Я не использую saveInstanceState, чтобы сделать что-нибудь. Android делает это сам.

Моя проблема:

Предположим, слово "test" присутствует в EditText. Когда я поворачиваю телефон, Android помещает «тестовый тест» в EditText при повторном создании действия. Это только происходит, когда я использую виртуальную клавиатуру для ввода в EditText, я не нажимаю кнопку «Готово» на виртуальной клавиатуре, я нажимаю назад, чтобы удалить виртуальную клавиатуру, и затем поворачиваю устройство , Если я использую кнопку «Готово» вместо кнопки «Назад», проблема не возникает.

Есть идеи? Как я уже сказал, я НЕ устанавливаю текст. Все строки, которые вызывают setText, были закомментированы.

Обновление 1: я закомментировал все в этом действии, кроме метода onCreate (). Проблема все еще возникает.

Обновление 2: я создал новую активность. Это новое действие имеет только метод onCreate (). Единственное, что есть в методе onCreate () - это вызов setContentView (использует тот же файл макета) и вызов onCreate () из super. Проблема все еще сохраняется. Я в тупике. Единственное, что я могу догадаться, это что-то странное с файлом макета. Я понятия не имею, что это будет.

Обновление 3: я удалил все из макета, кроме EditText. Проблема все еще возникает.

Ответы [ 3 ]

13 голосов
/ 27 июля 2011

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

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

2 голосов
/ 02 августа 2011

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

}
0 голосов
/ 15 мая 2011

Для обработки изменений поворота добавьте манифест android:configChanges:

        <activity

        android:name="yourActivity"
        android:configChanges="orientation"></activity>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...