web-dev-qa-db-fra.com

Android - EditText donne une exception IndexOutOfBounds lors de l'utilisation de textAllCaps

J'essaie de créer une page d'inscription très simple en utilisant une mise en page relative. Cette page d'inscription est liée à un fragment appelé RegistrationFragment.

J'ai cinq champs EditText pour cette disposition: nom, numéro de téléphone, email, mot de passe et confirmer le mot de passe. Pour une raison quelconque, je peux saisir du texte dans mot de passe et le confirmer, mais chaque fois que j'essaie de saisir du texte dans les autres champs, l'application plante immédiatement avec une exception IndexOutOfBounds.

Voici la trace complète de la pile:

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)

Mon fichier de mise en page 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>

Le cas échéant, je "regarde" mon code de fragment à l'aide de ce qui suit, qui se trouve à la fin de la méthode onCreate () de mon activité principale à des fins de test. J'ai eu les mêmes erreurs quand j'ai essayé de tester l'enregistrement en tant qu'activité.

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

J'ai eu le même problème avec textAllCaps pour EditText dans mon application.

J'ai trouvé que textAllCaps est une propriété pour TextView uniquement. Vous ne pouvez pas utiliser cette propriété pour EditText.

Donc, j'ai fait de la R & D pour cela et trouvé une meilleure solution à ce problème.

Plutôt que d'utiliser textAllCaps, nous pouvons utiliser Android:inputType="textCapCharacters".

Par exemple.

    <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>

Si nous utilisons Android:inputType="textCapCharacters", tous les caractères seront convertis en majuscules, comme nous le voulons dans textAllCaps.

P.S. Si vous utilisez la touche majuscule et tapez du texte, il peut convertir le texte en minuscule. Vous pouvez toujours utiliser la méthode toUpper() dans l'objet string pour la reconvertir en majuscule . Cela peut aider ..

Vous pouvez lire ces détails à partir de cet article de blog: https://androidacademic.blogspot.com/2018/05/indexoutofbounds-exception-while-using.html

112

Ok, le problème est que textAllCaps ne fonctionne pas pour les contrôles EditText. Cela ne fonctionne que pour les commandes qui ne sont pas modifiables (comme TextView). Selon la documentation sur setAllCaps() (qui est la version de code derrière la textAllCaps):

Ce paramètre sera ignoré si ce champ est modifiable ou sélectionnable

Donc ça ne marchera pas.

Maintenant, même si je ne sais pas pourquoi votre code s'est écrasé, il ne devrait pas l'avoir été, il aurait simplement dû être ignoré, mais peut-être que le problème se produit lorsque textAllCaps est défini à partir du fichier xml ... juste suggéré ce que j'aurais changé le premier, et espéré que cela fonctionnerait ...

En tout cas, je suis content d'avoir aidé ...

6
miselking

Je n'ai pas assez de réputation pour faire un commentaire, mais j'ai eu une exception d'exécution similaire (et un plantage) lors de l'utilisation d'une variable TextView et textAllCaps définie sur true.

Lorsque j'ai supprimé ce paramètre, tout a fonctionné comme prévu. Il semble donc que les conseils donnés ci-dessus peuvent également s'appliquer à TextView dans certains cas.

Il en va de même lorsque vous définissez Android:digits et que vous définissez truetextAllCaps lorsque vous utilisez EditText. La solution est la même, supprimez la textAllCaps.

3
BhavikUp

J'utilise textAllCaps pour TextView (pas EditText) mais il crash
Avec le même code qu'hier, mais aujourd'hui il plante (hier ne plante pas) (si je supprime le code textAllCaps, celui-ci fonctionnera normalement) 

Certains cas WON'T FIX mon problème 

  • Exécutez-le sur différents périphériques et API
  • Projet propre 
  • Redémarrer Android Studio
  • Non valide et redémarrez Android Studio
  • Redémarrer l'ordinateur
  • Supprimer tous un autre View, conservez seulement 1 TextView avec l'attribut textAllCaps dans la présentation

Ensuite, j'essaie d'exécuter mon code sur plusieurs ordinateurs différents et cela fonctionne (mon AndroidStudio est identique à un autre ordinateur)

  • J'essaie ensuite de réinitialiser tous les paramètres d'AndroidStudio sur mon ordinateur -> exécuter à nouveau le projet -> il se bloque toujours

Enfin, je supprime tout ce qui concerne Android sur mon ordinateur -> télécharger Android Studio -> installer -> exécuter le projet -> heureusement, il fonctionne

Ma version actuelle de l'AS est la suivante: 3.1.14. Je ne suis pas sûr que cela fonctionne dans votre cas ou pas, mais j'espère que cela vous aidera

0
Linh