【问题标题】:Android - EditText gives IndexOutOfBounds Exception while using textAllCapsAndroid - EditText 在使用 textAllCaps 时给出 IndexOutOfBounds 异常
【发布时间】:2015-04-23 01:19:09
【问题描述】:

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

我有五个用于此布局的 EditText 字段:姓名、电话号码、电子邮件、密码和确认密码。出于某种原因,我可以在密码中输入文本并确认密码,但是每当我尝试在其他字段中输入任何文本时,它们都会立即使应用程序崩溃并出现 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>

如果相关,我正在使用以下代码“查看”我的 Fragment 代码,该代码位于我的主要活动的 onCreate() 方法的末尾,用于测试目的。但是,当我尝试将注册作为一项活动进行测试时,我遇到了同样的错误。

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

【问题讨论】:

  • 发布 EditText 的 onClickListener 代码
  • 尝试从&lt;EditText /&gt;控件中删除textAllCaps,然后看看错误是否仍然出现...
  • @Morteza,我从某处读到这可能会导致问题,但实际上我的 EditTexts 没有任何 onClickListener 代码。
  • @miselking 这实际上是修复!如果您愿意将其作为答案,我绝对可以投票。不过,这会导致异常,这真的很奇怪。

标签: android android-fragments android-edittext


【解决方案1】:

我的应用程序中的textAllCapsEditText 有同样的问题。

我发现textAllCaps 只是TextView 的属性。 EditText 不能使用此属性。

所以,我为此做了研发,找到了更好的解决方案。

我们可以使用android:inputType="textCapCharacters",而不是使用textAllCaps

例如

    <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. 如果您使用 shift 键并输入文本,它可能会将文本转换为小写。您始终可以在字符串对象中使用toUpper() 方法将其转换回大写。 它可能会有所帮助...

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

【讨论】:

  • 这是处理这个问题的正确方法!
  • @Sufferer 很高兴它有帮助:)
  • android:inputType="textCapCharacters" 不会阻止用户点击Shift 并输入小写字符。
  • 如果我在 TabLayout 中使用 textAllCaps=false 会怎样。我应该怎么做?
  • @Euridice01 textAllCaps 是 TextView 的属性。您不应该将它用于 EditText。
【解决方案2】:

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

如果此字段可编辑或可选择,则此设置将被忽略

所以,它不会起作用。

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

不管怎样,我很高兴能帮上忙……

【讨论】:

  • 嗯。我没有足够的声誉来投票。但你就是答案。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    某些情况无法解决我的问题

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

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

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

    最后,我在我的计算机中删除了所有与 Android 相关的东西 -> 下载 Android Studio -> 安装 -> 运行项目 -> 幸运的是它可以工作

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-10
      • 2018-10-12
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      相关资源
      最近更新 更多