StringIndexOutOfBoundsException bei SDK 28 (Android 9)

A

andDna

Gast
Hallo zusammen,
seit Tagen habe ich ein Problem mit einem Fehler.
Der Fehler tritt immer bei den Geräten mit Android 9 (SDK 28) auf. Ältere Geräte sind von dem Fehler nicht betroffen.
Als Fehlecode wird mir immer ein allgemeines Log dargestellt. Leider kann ich mit dem Log nicht viel anfangen da es sehr allgemein ist. Blöderweise wird diese Meldung an der Stelle dargestellt an der überhaupt keine substing Methode oder ähnliches verwendet wird.
Daten aus build.gradle Datei:
compileSdkVersion 28
buildToolsVersion '28.0.3'
minSdkVersion 19
targetSdkVersion 21

Egal wie ich den vemutlichen Fehler korrigiere, das Programm stürzt mit der gleichen Fehlermeldung ab.

Kenn jemand das Problem ? Bitte um Hilfe.

Code des Fehlers:

Code:
java.lang.StringIndexOutOfBoundsException: length=314; index=315
at java.lang.String.substring(String.java:2032)
at java.lang.String.subSequence(String.java:2079)
at android.widget.TextView.onProvideAutoStructureForAssistOrAutofill(TextView.java:11898)
at android.widget.TextView.onProvideAutofillStructure(TextView.java:11807)
at android.view.View.dispatchProvideStructureForAssistOrAutofill(View.java:9428)
at android.view.View.dispatchProvideAutofillStructure(View.java:9421)
at android.view.ViewGroup.dispatchProvideAutofillStructure(ViewGroup.java:3774)
at android.view.ViewGroup.dispatchProvideAutofillStructure(ViewGroup.java:3774)
at android.view.ViewGroup.dispatchProvideAutofillStructure(ViewGroup.java:3774)
at android.view.ViewGroup.dispatchProvideAutofillStructure(ViewGroup.java:3774)
at android.app.assist.AssistStructure$WindowNode.<init>(AssistStructure.java:517)
at android.app.assist.AssistStructure.<init>(AssistStructure.java:2047)
at android.app.ActivityThread.handleRequestAssistContextExtras(ActivityThread.java:3411)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1921)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7156)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
 
Hallo
Es sagt dir doch das du außerhalb des Bereiches bist Länge 314 und dein Index ist wohl 315. Also außerhalb des Bereiches von wo auch immer denke array oder liste.
 
stimmt, nur an der stelle ist kein Array oder Ähnliches. Es wird auch nichts mit substring aufgerufen. Genau das verwirrt mich ein wenig. Es ist einfach ein Fenster mit TextViews und EditTexts und in der Text aus Textviews und EditTexts wird wie folgt abgelesen:

Code:
String text= "";
if (myEditText.getText().toString().length() != 0 || myEditText.getText().toString().trim().length() != 0) {
    text= myEditText.getText().toString();
}
 
Zuletzt bearbeitet von einem Moderator:
Ich würde sagen es ligt an dem trim denn damit werden ja zb lehrzrichen abgetrennt und somit stimmt die Länge wohl nicht mehr. Das ist für mich kein guter java Code wie du das machst. Da sind wohl die alten handys etwas toleranter.

Ich frage mich wo zu du nach lehrzeichen prüfst. Denn du prüfst ja schon ob überhaupt ein Zeichen im string ist. Auch wenn lehrzrichen am Anfang sind geht es weiter da es ja eine oder Verknüpfung ist.
 
Zuletzt bearbeitet:
ich möchte vermeiden dass ein Feld ohne Inhalt da ist.
Wenn ich die Prüfung auf Leerzeichen weglassen würde, kann im Feld immer noch ein Leerzeichen stehen (am Anfang eines Wortes zb., oder wenn man einfach mehrere Leerzeichen eintippt ) und somit wäre schon ein Zeichen da weil das Feld befüllt ist.
Tipp mit trim ist schon sehr hilfreich. Wie kann ich Inhalt des Felder prüfen dass es nicht leer ist ohne die Leerzeichen, ohne dabei die trimm Methode zu verwenden ?
 
Nicht lehr prüfst du doch schon mit dem ersten therm. Deshalb Macht es für mich keinen Sinn das mit dem trim ist ja ein oder was du machst und wenn irgend etwas in dem String ist , ist das oder wahr und es geht in den ifzweig. Somit ist der zweite therm der oder Operation sinnlos.

Auch ein freizeichen oder ein tab sind Zeichen und der String und somit deine Länge ist grösser als 0 also nicht 0.
 
Ahm,
dann kann ich einfach sowas machen mit length() != 0

Code:
String text= "";
if (myEditText.getText().toString().length() != 0 ) {
   text= myEditText.getText().toString();
}

bzw. mit ! isEmpty ().

Code:
String text= "";
if (!myEditText.getText().toString().isEmpty() ) {
   text= myEditText.getText().toString();
}


aber nicht beides. Es wäre das gleiche.
Code:
String text= "";
if (!myEditText.getText().toString().isEmpty() || myEditText.getText().toString().length() != 0) {
   text= myEditText.getText().toString();
}
 
nein. hat leider nichts gebracht. Der Fehler kommt immer noch.
 
Dann zeige doch mal wo wirklich nach deiner Meinung der Fehler sein soll?
Wie viele Zeichen sind den in dem edittext? Nach der Fehler Meldung sollten es ja 314 sein. Und du willst auf das 315 zugreifen. Somit wird er wohl nicht der edittext sein. Ohne Code kommen wir da hier nicht viel weiter.

Frage warum benutzt du
TargetSDK 21

compileSdkVersion 28
buildToolsVersion '28.0.3'
minSdkVersion 19
 
Das hat was mit den EditText Feldern bei Android 9 zu tun.
Ab Android 8 gibt es eine Erweiterung für die EditTextField => Autofill. Wenn diese Option auf den Endgeräten aktiviert ist, stürzt das Proggramm in 99 % der Fälle ab beim Klicken auf das Textfeld.
Die einzige Möglichkeit die ich gefunden habe war das manuelle Auschalten der Funktion Autofill in den Einstellungen der Endgeräte.
Die Lösungen wie: android:importantForAutofill="noExcludeDescendants" oder

Code:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
myEditText.setImportantForAutofill(AppCompatEditText.IMPORTANT_FOR_AUTOFILL_NO);
}

haben bis heute nichts gebracht.
 
  • Danke
Reaktionen: theotterone
Ok mit autofill könnte es zu tunen haben. Aber wenn du uns nicht genauer zeigst was du tust u nd Wie dein layout an der Stelle aussieht kommen wir nicht weiter.
 
Das Feld füge in zum Layout mit dem Code dynamisch ein:

Code:
final EditText myEditText = new EditText(context);
String txt = "test";
myEditText.setLayoutParams(new LinearLayout.LayoutParams(543, ViewGroup.LayoutParams.WRAP_CONTENT));
myEditText.setPadding(10, 0, 10, 0);
myEditText.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
myEditText.setBackgroundResource(R.drawable.icon);
myEditText.setTextAppearance(context, R.style.my_style);
myEditText.getBackground().setColorFilter(Color.parseColor(Constants.COLOR), PorterDuff.Mode.SRC_IN);
myEditText.setHint("Text");
myEditText.setText(txt);
myEditText.setHintTextColor(Color.GRAY);
myEditText.setEms(40);
layout.addView(myEditText);

Andere EditTextFields sind in XML Layoutdateien. Code:
Code:
<EditText
                android:id="@+id/etf"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:editable="true"
                android:hint="test"
                android:maxLength="60"
                android:singleLine="true" />

Die Activitys haben diese Struktur in Manifest:

Code:
<activity
            android:name=".MyActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:label="@string/title_txt"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden|adjustPan" />

Der Fehler tritt sowohl bei dynamischen, als auch bei in xml eingefügten Feldern auf.
 
Mal eine Frage wie wo und wan greift du den auf dein edittext zu.

Bei der XML Variante machst du da auch ein findviewbyid? Um auch daraus etwas zu lesen.

Bei der programmatischen Variante wie übergibst du den deine variable. Damit die auch bei abfragen zur Verfügung steht.
Dein myEdittext ist ja nur eine lokale variable mehr nicht. Wo und wie wird die benutzt.?
 
@andDna
andDna schrieb:
Das hat was mit den EditText Feldern bei Android 9 zu tun.
Ab Android 8 gibt es eine Erweiterung für die EditTextField => Autofill. Wenn diese Option auf den Endgeräten aktiviert ist, stürzt das Proggramm in 99 % der Fälle ab beim Klicken auf das Textfeld.
Die einzige Möglichkeit die ich gefunden habe war das manuelle Auschalten der Funktion Autofill in den Einstellungen der Endgeräte.
Die Lösungen wie: android:importantForAutofill="noExcludeDescendants" oder

Code:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
myEditText.setImportantForAutofill(AppCompatEditText.IMPORTANT_FOR_AUTOFILL_NO);
}

haben bis heute nichts gebracht.

Versuchs mal mit diesem Ansatz die Autofill Funktion für deine App auszuschalten https://stackoverflow.com/a/46082925

Nach etlichen Versuchen hat diese Lösung bei mir geklappt
 
  • Danke
Reaktionen: jogimuc und swa00
Hallo @theotterone schön das du dich darum kümmerst. Nur war der TE seit dem letzten post nicht mehr online. Scheint wohl nicht mehr wichtig zu sein.
 
Zuletzt bearbeitet von einem Moderator:
  • Danke
Reaktionen: swa00

Ähnliche Themen

M
Antworten
4
Aufrufe
1.173
swa00
swa00
5
Antworten
0
Aufrufe
1.150
586920
5
B
Antworten
4
Aufrufe
491
bb321
B
Zurück
Oben Unten