【问题标题】:EditText doubling out on rotateEditText 在旋转时翻倍
【发布时间】:2011-05-15 01:12:30
【问题描述】:

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

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

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

我的问题:

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

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

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

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

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

【问题讨论】:

  • editText.append() 怎么样?你用这样的东西吗?如果是这样,也许你也应该禁用它们
  • 如果您想通过配置更改存储 EditText 内容,到目前为止,我一直在成功使用 onRetainNonConfigurationInstance。例如,您可以从此方法返回您的 EditText 内容字符串。您可以使用getLastNonConfigurationInstance 在 onCreate 上检索它,如果没有可用的保存数据,则返回 null。
  • 您是否尝试过使用物理设备?更新了你的 ADK?老实说,这听起来像是你的模拟器的一个错误。
  • 我也有同样的问题。设备也是 Nexus S。在 EditText 中完成书写后,按下后​​退按钮并在改变方向后快速,内容加倍。但只有最后一个输入被强调并用于单词建议。
  • 也发生在我身上。一开始以为我要疯了。如果我输入,启动另一个活动,点击后退按钮,然后旋转、繁荣、双文本。

标签: android rotation android-edittext


【解决方案1】:

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

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

【讨论】:

  • Android 4.0.3 上仍然存在此错误,但此修复有效。但我真的很希望能够为我的用户提供自动完成功能......
【解决方案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。
【解决方案3】:

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

        <activity

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

【讨论】:

  • 我试过了,但它仍然会替换文本而无需我做任何事情。
猜你喜欢
  • 1970-01-01
  • 2013-01-04
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多