web-dev-qa-db-ja.com

Android-EditTextはtextAllCapsの使用中にIndexOutOfBounds例外を発生させます

相対レイアウトを使用して非常に単純な登録ページを作成しようとしています。この登録ページは、RegistrationFragmentと呼ばれるフラグメントにリンクされています。

このレイアウトには、名前、電話番号、メール、パスワード、確認パスワードの5つのEditTextフィールドがあります。何らかの理由で、パスワードにテキストを入力してパスワードを確認できますが、他のフィールドにテキストを入力しようとすると、IndexOutOfBounds Exceptionでアプリケーションがすぐにクラッシュします。

完全なスタックトレースを次に示します。

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()メソッドの最後にあります。アクティビティとして登録をテストしようとしたときに、同じエラーが発生しました。

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

アプリケーションのtextAllCapsEditTextにも同じ問題がありました。

textAllCapsTextViewのみのプロパティであることがわかりました。このプロパティをEditTextに使用することはできません。

そこで、私はそれのために研究開発を行い、この問題に対するより良い解決策を見つけました。

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で必要なように、すべての文字が大文字に変換されます。

P.S。Shiftキーを使用してテキストを入力すると、テキストが小文字に変換される場合があります。文字列オブジェクトで常にtoUpper()メソッドを使用して、大文字に戻すことができます。役立つかもしれません。

このブログ投稿からこれらの詳細を読むことができます: https://androidacademic.blogspot.com/2018/05/indexoutofbounds-exception-while-using.html

120

問題は、textAllCapsEditTextコントロールに対して機能しないことです。編集できないコマンド(TextViewなど)でのみ機能します。 setAllCaps()(これはtextAllCapsのコードビハインドバージョンです)のドキュメントによると:

このフィールドが編集可能または選択可能な場合、この設定は無視されます

そのため、機能しません。

今、私はあなたのコードがクラッシュした理由がわからない、それは持ってはいけない、それは単に無視されるべきであるが、多分、問題はtextAllCapsがxmlファイルから設定されるときに起こる...私はそうではなかった確かですが、最初に変更したものを提案し、それが機能することを望みました...

とにかく、助けてくれてうれしいです...

6
miselking

コメントをするほどの評判はありませんが、TextViewtextAllCapstrueに設定して使用しているときに、同様のランタイム例外(およびクラッシュ)が発生しました。

その設定を削除すると、すべてが期待どおりに機能しました。したがって、上記のアドバイスは特定の場合にTextViewにも適用できるようです。

trueの使用中にAndroid:digitsを設定し、textAllCapsEditTextに設定した場合も同じことが起こります。解決策は同じです。textAllCapsを削除してください。

3
BhavikUp

私はtextAllCapsTextViewEditTextではなく)を使用していますが、それはcrash
昨日と同じコードですが、今日はcrash(昨日はクラッシュしません)(削除するとtextAllCapsコードが正常に実行されます)

いくつかのケース修正しない私の問題

  • 別のデバイスとAPIで実行する
  • クリーンプロジェクト
  • 再起動Android Studio
  • 無効で再起動Android Studio
  • コンピューターを再起動
  • all別のViewを削除し、レイアウト内でTextView属性を持つtextAllCaps属性を1つだけ保持します

次に、いくつかの異なるコンピューターでコードを実行しようとしますit WORKING(私のAndroidStudioは別のコンピューターと同じです)

  • 次に、コンピューターのすべてのAndroidStudio設定をリセットしようとします->プロジェクトを再度実行します-> まだクラッシュします

最後に、Android自分のコンピューター->ダウンロードAndroid Studio->インストール->プロジェクトの実行-> 幸いなことに働く

現在のASバージョンは3.1.14です。私はそれがあなたのケースで機能するかどうかはわかりませんが、それが役立つことを願っています

0
Phan Van Linh