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
时会出现问题] 文件...我不确定,但我只是建议我首先要更改的内容,并希望它会起作用...
无论如何,我很高兴我帮了...
在我的申请中,EditText
的 textAllCaps
遇到了同样的问题。
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
我没有足够的声誉来发表评论,但我在使用 TextView
和 textAllCaps
设置为 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。我不确定它是否适用于您的情况,但希望对您有所帮助!
我正在尝试使用相对布局创建一个非常简单的注册页面。此注册页面链接到名为 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
时会出现问题] 文件...我不确定,但我只是建议我首先要更改的内容,并希望它会起作用...
无论如何,我很高兴我帮了...
在我的申请中,EditText
的 textAllCaps
遇到了同样的问题。
I have found that
textAllCaps
is a property forTextView
only. You can not use this property forEditText
.
于是,我对其进行了研发,针对这个问题找到了更好的解决方案。
Rather than using
textAllCaps
we can useandroid: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
我没有足够的声誉来发表评论,但我在使用 TextView
和 textAllCaps
设置为 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。我不确定它是否适用于您的情况,但希望对您有所帮助!