Android – EditText在使用textAllCaps时会产生IndexOutOfBoundsexception

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

我有这个布局的五个EditText字段:名称,电话号码,电子邮件,密码,并确认密码。 出于某种原因,我可以input文本到密码并确认密码,但每当我尝试input任何文本到其他字段,他们立即崩溃应用程序与IndexOutOfBoundsexception。

这是完整的堆栈跟踪:

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> 

如果相关,我正在使用下面的代码来查看我的代码片段代码,这些代码位于我的主要活动的onCreate()方法的末尾,用于testing目的。 当我尝试testing注册作为一个活动,但我得到了同样的错误。

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

好吧,我知道它晚了..但它可以帮助未来的其他人..

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

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

所以,我search了它,并find了更好的解决scheme。

而不是使用textAllCaps我们可以使用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

PS如果您使用Shift键并键入文本,则可能会将文本转换为小写字母。 您总是可以使用string对象中的toUpper()方法将其转换回大写字母。 这可能有帮助..

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

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

所以,这是行不通的。

现在,即使我不知道为什么你的代码崩溃,它不应该有,应该只是被忽略,但也许,问题发生在textAllCaps从XML文件设置…我不知道,但我只是build议我会改变第一个,并希望这将工作…

无论如何,我很高兴我帮助…

我没有足够的声望来发表评论,但是当使用TextViewtextAllCaps设置为true时,我有一个类似的运行时exception(和崩溃)。

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