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);
J'ai eu le même problème avec textAllCaps
pour EditText
dans mon application.
J'ai trouvé que
textAllCaps
est une propriété pourTextView
uniquement. Vous ne pouvez pas utiliser cette propriété pourEditText
.
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 utiliserAndroid: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
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é ...
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 true
textAllCaps
lorsque vous utilisez EditText
. La solution est la même, supprimez la textAllCaps
.
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
View
, conservez seulement 1 TextView
avec l'attribut textAllCaps
dans la présentationEnsuite, j'essaie d'exécuter mon code sur plusieurs ordinateurs différents et cela fonctionne (mon AndroidStudio est identique à un autre ordinateur)
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