EditText加倍旋转

我遇到了EditText控件的问题。 这个问题只发生在这个特定的Activity上,没有其他的EditTexts活动。 我已经删除了此EditText的所有setText调用,问题仍然存在。

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

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

我的问题:

假设“testing”一词在EditText中。 当我旋转手机时,Android会在重新创buildActivity时将“testtest”放入EditText中。 这只发生在我用虚拟键盘inputEditText的时候,我不点击虚拟键盘上的“完成”button,我按回去除了虚拟键盘,然后旋转设备。 如果我使用“完成”button而不是后退button,问题不会发生。

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

更新1:除了onCreate()方法之外,我已经评论了此Activity中的所有内容。 问题仍在发生。

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

更新3:除了EditText之外,我已经除掉了所有的布局。 问题仍在发生。

Solutions Collecting From Web of "EditText加倍旋转"

我有一个类似的问题,但只有在为EditText打开AutoComplete时才能看到它。

我的工作是禁用自动完成。 <EditText . . . android:inputType="textMultiLine|textNoSuggestions" />

我想出了一个可以尝试的解决方法。 它通过inheritanceEditText的方法工作,捕获一些事件,然后只接受显示键盘时发生的文本更改,这些更改应该过滤掉用户input内容所做的任何更改。 我仍然不知道可能是什么原因造成的。

 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); } } 

android:configChanges处理旋转更改,请添加您的清单android:configChanges

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