Android - EditText 在使用 textAllCaps 时出现 IndexOutOfBounds 异常

Android - EditText gives IndexOutOfBounds Exception while using textAllCaps

我正在尝试使用相对布局创建一个非常简单的注册页面。此注册页面链接到名为 RegistrationFragment 的片段。

此布局有五个 EditText 字段:名称、phone 号码、电子邮件、密码和确认密码。出于某种原因,我可以在密码中输入文本并确认密码,但每当我尝试在其他字段中输入任何文本时,它们会立即使应用程序崩溃并出现 IndexOutOfBounds 异常。

这是完整的堆栈跟踪:

java.lang.IndexOutOfBoundsException
        at android.graphics.Paint.getTextRunAdvances(Paint.java:1879)
        at android.text.TextLine.handleText(TextLine.java:747)
        at android.text.TextLine.handleRun(TextLine.java:898)
        at android.text.TextLine.measureRun(TextLine.java:414)
        at android.text.TextLine.measure(TextLine.java:293)
        at android.text.TextLine.metrics(TextLine.java:267)
        at android.text.Layout.getLineExtent(Layout.java:998)
        at android.text.Layout.drawText(Layout.java:329)
        at android.widget.Editor.drawHardwareAccelerated(Editor.java:1380)
        at android.widget.Editor.onDraw(Editor.java:1303)
        at android.widget.TextView.onDraw(TextView.java:5163)
        at android.view.View.draw(View.java:14465)
        at android.view.View.getDisplayList(View.java:13362)
        at android.view.View.getDisplayList(View.java:13404)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3077)
        at android.view.View.getDisplayList(View.java:13300)
        at android.view.View.getDisplayList(View.java:13404)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3077)
        at android.view.View.getDisplayList(View.java:13300)
        at android.view.View.getDisplayList(View.java:13404)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3077)
        at android.view.View.getDisplayList(View.java:13300)
        at android.view.View.getDisplayList(View.java:13404)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3077)
        at android.view.View.getDisplayList(View.java:13300)
        at android.view.View.getDisplayList(View.java:13404)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3077)
        at android.view.View.getDisplayList(View.java:13300)
        at android.view.View.getDisplayList(View.java:13404)
        at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1570)
        at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1449)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2377)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2249)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1879)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
        at android.view.Choreographer.doCallbacks(Choreographer.java:574)
        at android.view.Choreographer.doFrame(Choreographer.java:544)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)

我的 xml 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#e5e5e5">

<TextView
    android:id="@+id/fragment_registration_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="@dimen/activity_vertical_margin"
    android:layout_marginTop="@dimen/activity_vertical_margin"
    android:layout_marginRight="@dimen/activity_horizontal_margin"
    android:layout_marginLeft="@dimen/activity_horizontal_margin"
    android:text="@string/registration_title"
    android:textAllCaps="true"
    android:textSize="35sp"
    android:layout_centerHorizontal="true"
    android:textColor="@color/blue"
    />

<RelativeLayout
    android:id="@+id/fragment_registration_edit_text_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="30dp"
    android:layout_marginRight="30dp"
    android:layout_below="@id/fragment_registration_title"
    android:layout_centerHorizontal="true">

    <EditText
        android:id="@+id/fragment_registration_legal_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:hint="@string/full_name_prompt"
        android:maxLines="1"
        android:textAllCaps="true"
        android:background="@drawable/edit_text_top_rounded"
        />

    <EditText
        android:id="@+id/fragment_registration_cell_phone"
        android:layout_below="@id/fragment_registration_legal_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:hint="@string/cell_phone_prompt"
        android:maxLines="1"
        android:textAllCaps="true"
        android:background="@drawable/edit_text_white"
        />

    <EditText
        android:id="@+id/fragment_registration_email"
        android:layout_below="@id/fragment_registration_cell_phone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:hint="@string/email_prompt"
        android:maxLines="1"
        android:textAllCaps="true"
        android:background="@drawable/edit_text_white"
        />

    <EditText
        android:id="@+id/fragment_registration_password"
        android:layout_below="@id/fragment_registration_email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:hint="@string/confirm_password_prompt"
        android:maxLines="1"
        android:background="@drawable/edit_text_bottom_rounded"
        />

    </RelativeLayout>

<Button
    android:id="@+id/fragment_registration_button"
    android:background="@drawable/button_registration"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/registration_button"
    android:textColor="#ffffff"
    android:layout_below="@+id/fragment_registration_edit_text_layout"
    android:layout_marginTop="5dp"
    android:layout_marginLeft="30dp"
    android:layout_marginRight="30dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    />
</RelativeLayout>

如果相关,我 "looking" 使用下面的代码在我的片段代码中,它位于我的主要 activity 的 onCreate() 方法的末尾,用于测试目的。不过,当我尝试将注册测试为 activity 时,我遇到了同样的错误。

RegistrationFragment test = new RegistrationFragment();
setContentView(R.layout.fragment_registration);

好的,问题是 textAllCaps 不适用于 EditText 控件。它仅适用于不可编辑的命令(如 TextView)。根据 setAllCaps() 的文档(这是 textAllCaps 版本的代码):

This setting will be ignored if this field is editable or selectable

所以,它不会起作用。

现在,即使我不确定为什么你的代码崩溃了,它不应该崩溃,它应该被忽略,但也许,当从 [=25= 设置 textAllCaps 时会出现问题] 文件...我不确定,但我只是建议我首先要更改的内容,并希望它会起作用...

无论如何,我很高兴我帮了...

在我的申请中,EditTexttextAllCaps 遇到了同样的问题。

I have found that textAllCaps is a property for TextView only. You can not use this property for EditText.

于是,我对其进行了研发,针对这个问题找到了更好的解决方案。

Rather than using textAllCaps we can use android:inputType="textCapCharacters".

例如

    <EditText
        android:id="@+id/edittext1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textCapCharacters"
        android:hint="@string/first_name"
        android:padding="10dp" >
    </EditText>

如果我们使用 android:inputType="textCapCharacters" 它会将所有字符转换为大写,就像我们在 textAllCaps.

中想要的那样

P.S. If you use the shift key and type text it may convert the text in lowercase. You can always use toUpper() method in string object to convert it back to uppercase. It may help...

您可以从此博客中阅读这些详细信息 post:https://androidacademic.blogspot.com/2018/05/indexoutofbounds-exception-while-using.html

我没有足够的声誉来发表评论,但我在使用 TextViewtextAllCaps 设置为 true 时遇到了类似的运行时异常(和崩溃)。

当我删除该设置后,一切都按预期进行。所以上面给出的建议似乎在某些情况下也适用于TextView

当您设置 android:digits 并在使用 EditText 时设置为 true textAllCaps 时也会发生同样的情况。解决方法一样,去掉textAllCaps.

我正在使用 textAllCaps 作为 TextView(不是 EditText)但是它 崩溃
使用与昨天相同的代码,但今天它 崩溃 (昨天不会崩溃)(如果我删除 textAllCaps 代码将 运行 正常)

有些案例无法解决我的问题

  • 运行 它在不同的设备上和 API
  • 清理项目
  • 重新启动 Android Studio
  • 无效并重启Android Studio
  • 重启电脑
  • 删除所有另一个View,只保留1个TextView在布局textAllCaps属性

然后,我尝试在几台不同的计算机上 运行 我的代码并且 它工作 (我的 AndroidStudio 与另一台计算机相同)

  • 然后我尝试在我的计算机上重置所有 AndroidStudio 设置 -> 运行 项目 -> 它仍然崩溃

最后,我删除了我电脑中与 Android 相关的所有东西 -> 下载 Android Studio -> 安装 -> 运行 项目 -> 幸运的是工作

我当前的AS版本是3.1.14。我不确定它是否适用于您的情况,但希望对您有所帮助!