EditText在旋转时加倍

时间:2011-05-15 01:12:30

标签: android rotation android-edittext

我遇到了EditText控件的问题。此问题仅发生在此特定活动上,而没有其他活动与EditTexts。我删除了此EditText的所有setText调用,问题仍然存在。

我在移动设备上运行Android 2.3.4。这是一款Nexus S和Android的运行股票。在模拟器(运行Android 2.2)中,不会发生此问题。

当我旋转手机时,Android会自动替换旋转前EditText中的文本。我没有使用savedInstanceState来做任何事情。 Android就是这样做的。

我的问题:

假设单词“test”在EditText中。当我旋转手机时,Android会在重新创建活动时将“testtest”放入EditText。当我使用虚拟键盘键入EditText时,会发生 only ,我没有单击虚拟键盘上的“完成”按钮,我按回去删除虚拟键盘,然后我旋转设备。如果我使用“完成”按钮而不是后退按钮,则不会出现问题。

有什么想法吗?正如我所说,我设置文本。所有调用setText的行都已注释掉了。

更新1:除了onCreate()方法之外,我已经注释掉了这个Activity中的所有内容。问题仍然存在。

更新2:我创建了一个新活动。这个全新的Activity只有一个onCreate()方法。 onCreate()方法中唯一的事情是调用setContentView(使用相同的布局文件)并调用super的onCreate()。问题仍然存在。我很难过。我唯一可以猜到的是布局文件有些不可思议。我不知道会是什么。

更新3:除了EditText之外,我已将所有内容从布局中删除。问题仍然存在。

3 个答案:

答案 0 :(得分:13)

我遇到了类似的问题但我只在为EditText打开自动完成功能时看到它。

我的工作是禁用自动填充功能。 <EditText . . . android:inputType="textMultiLine|textNoSuggestions" />

答案 1 :(得分: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'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);
    }   

}

答案 2 :(得分:-1)

要自行处理轮换更改,请添加清单android:configChanges

        <activity

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