旋转后EditText重复出现

25

我在EditText控件上遇到了问题。该问题仅发生在此特定Activity上,而其他包含EditText的Activity则没有此问题。我已经删除了所有对此EditText的setText调用,但问题仍然存在。

我的移动设备上运行着Android 2.3.4。它是Nexus S,并且运行着原始的Android系统。在模拟器(运行Android 2.2)中,不会出现此问题。

当我旋转手机时,Android会自动替换旋转之前在EditText中的文本,我并没有使用savedInstanceState进行任何操作,Android是自己处理的。

我的问题:

假设EditText中有单词“test”。当我旋转手机时,Android会在重新创建Activity时将“testtest”放入EditText中。这种情况发生在我使用虚拟键盘键入EditText时,而不是点击虚拟键盘上的“完成”按钮,我按下返回按钮来移除虚拟键盘,然后旋转设备。如果我使用“完成”按钮而不是返回按钮,则不会出现问题。

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

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

更新2:我创建了一个新的Activity。这个全新的Activity只有一个onCreate()方法。onCreate()方法中只有一行代码,即调用setContentView(使用相同的布局文件)和调用super的onCreate()方法。问题仍然存在。我束手无策了。我唯一能猜测的是布局文件有些奇怪。但我不知道是什么问题。

更新3:我已经从布局中剥离出所有内容,只保留EditText。问题仍然存在。


editText.append()怎么办?你使用这个吗?如果是的话,也许你应该禁用它们。 - dds
如果您想在配置更改时存储EditText内容,我迄今为止一直成功地使用onRetainNonConfigurationInstance。例如,您可以从此方法返回EditText内容字符串。您可以使用getLastNonConfigurationInstance检索它,在没有可用的保存数据时返回null。 - harism
你尝试过使用物理设备吗?更新了你的 ADK 吗?老实说,这听起来像是你的模拟器出现了 bug。 - Austin Hanson
我在我的Nexus 4上遇到了同样的问题。现在(2013年1月),textNoSuggestions已经消失了。最后我使用了textVisiblePassword。它能用,但这真是太糟糕了。 - spotcatbug
在我看来,这是一个平台错误。它出现在我的三星Galaxy Nexus上,但不会在同事的HTC上出现。我已经在https://code.google.com/p/android/issues/detail?id=50573上报告了它。 - Almer
显示剩余2条评论
3个回答

13

我曾经遇到过类似的问题,但只有在EditText启用AutoComplete时才会出现。

我的解决方法是禁用自动完成。 <EditText . . . android:inputType="textMultiLine|textNoSuggestions" />


这个漏洞在Android 4.0.3上仍然存在,但是这个修复方法有效。但我真的很想为我的用户提供自动完成功能... - JDJ

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

}

谢谢 - 我喜欢这个解决方案!我只想补充一点,如果你决定在“完成”操作时隐藏键盘,你可以同时再次设置keyboardHidden=true。 - Nims

-1

如果要自己处理旋转变化,请在清单文件中添加android:configChanges

        <activity

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

我尝试过这个,但它仍然在没有我的任何操作下替换了文本。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接