我遇到了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之外,我已将所有内容从布局中删除。问题仍然存在。
答案 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>