24

I'm having trouble figuring out this one out. I'm unable to reproduce on my phone (nexus 4). Doesn't seem to effect all devices but I have enough reports where it's frustrating to see it keep occurring.

java.lang.ArrayIndexOutOfBoundsException: length=10; index=10
at android.text.StaticLayout.calculateEllipsis(StaticLayout.java:938)
at android.text.StaticLayout.out(StaticLayout.java:859)
at android.text.StaticLayout.generate(StaticLayout.java:524)
at android.text.StaticLayout.<init>(StaticLayout.java:147)
at android.widget.TextView.makeSingleLayout(TextView.java:6583)
at android.widget.TextView.makeNewLayout(TextView.java:6429)
at android.widget.TextView.onMeasure(TextView.java:6807)
at android.view.View.measure(View.java:16047)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1232)
at android.widget.TableRow.onMeasure(TableRow.java:114)
at android.view.View.measure(View.java:16047)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4921)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
at android.widget.TableLayout.measureChildBeforeLayout(TableLayout.java:464)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.TableLayout.measureVertical(TableLayout.java:476)
at android.widget.TableLayout.onMeasure(TableLayout.java:439)
at android.view.View.measure(View.java:16047)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4921)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:16047)
at android.widget.ListView.measureScrapChild(ListView.java:1190)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1255)
at android.widget.ListView.onMeasure(ListView.java:1165)
at android.view.View.measure(View.java:16047)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4921)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:16047)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4921)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:16047)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:16047)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4921)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2418)
at android.view.View.measure(View.java:16047)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2129)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1282)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1493)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1179)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4861)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
at android.view.Choreographer.doCallbacks(Choreographer.java:562)
at android.view.Choreographer.doFrame(Choreographer.java:532)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5293)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
Raghunandan
  • 132,755
  • 26
  • 225
  • 256
Paul
  • 1,714
  • 7
  • 22
  • 45
  • 3
    I'm a java man not an android man, but an array with length 10 has indexes 0,1,2,3,4,5,6,7,8,9. At some point you're accessing a non existant index 10 – Richard Tingle Jun 11 '13 at 14:54
  • 2
    What code to post?This looks like an issue with my layout somehow which is XML? – Paul Jun 11 '13 at 14:59

6 Answers6

38

Need to set attributes android:lines="1" android:singleLine="true" https://code.google.com/p/android/issues/detail?id=33868

user2738318
  • 381
  • 3
  • 3
  • 2
    I have the same issue, what if I need to setLines(2..X), than the singleLine="true" workaround probably won't do – Petr Nalevka Oct 17 '14 at 14:57
  • Correct, `android:singleLine="true"` is necessary. Strange, given that it was deprecated already (once in the past) and the documentation doesn't list it as a *requirement*: "You will often also want to set scrollHorizontally or singleLine as well so that the text as a whole is also constrained to a single line instead of still allowed to be broken onto multiple lines." http://developer.android.com/reference/android/widget/TextView.html#attr_android:ellipsize – caw Nov 08 '14 at 16:35
  • 6
    And what if I want a ellips on multiple lines? android:ellipsize="end" and android:maxLines="3" and android:singleLine="false", will crash? – Frank Feb 16 '15 at 09:20
  • I am having the same issue. where should I add those two line? – Dhiraj Devkar Mar 25 '15 at 18:37
4

This is a bug. reported in android itself please ignore to use start. https://code.google.com/p/android/issues/detail?id=33868

Rakesh Sen
  • 101
  • 4
4

Issue

  1. If we set android:maxLines="1" android:ellipsize="middle" then our application crashes in some devices.

Solution

  1. Android documentation says that when we set "android:maxLines" property then for "android:ellipsize" property only End and Marquee is supported.

Reference

setEllipsize

added in API level 1

void setEllipsize (TextUtils.TruncateAt where)

Causes words in the text that are longer than the view's width to be ellipsized instead of broken in the middle. You may also want to setSingleLine() or setHorizontallyScrolling(boolean) to constrain the text to a single line. Use null to turn off ellipsizing. If setMaxLines(int) has been used to set two or more lines, only END and MARQUEE are supported (other ellipsizing types will not do anything).

Vasanth
  • 6,257
  • 4
  • 26
  • 19
0

They should have at least added this to Lint! :S You can use a custom textview to fix this.

public class MyTextView extends TextView {
    public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyTextView(Context context) {
        super(context);
        init();
    }

    private void init() {

        // this is to overcome the calculateEllipsis bug in some versions of android, I spotted it on 4.4.4 and 4.4.3
        // see https://code.google.com/p/android/issues/detail?id=33868

        if (Build.VERSION.SDK_INT >= 16) {
            if (getMaxLines() == 1) {
                setSingleLine(true);
            }
        }
    }
}

reference MyTextView in your xml instead of the normal textview.

Frank
  • 12,010
  • 8
  • 61
  • 78
-3

Array indices begin at 0 and end at the array length minus 1..So limit loop to 9.

Suresh Atta
  • 120,458
  • 37
  • 198
  • 307
  • 9
    -1, cause stacktrace is clearly points that the IndexOutOfBounds is not in client code, but in Androids native code. http://stackoverflow.com/a/18564198/1855764 - this is a right answer – Yan.Yurkin Nov 30 '13 at 07:30
-4

change the for loop look like this

your array length 0 to 10

for (int i=0; i<9; i++)
{
      System.out.println("value is  ofposition"+yourArrayList[i]);
}
MalhotraUrmil
  • 88
  • 1
  • 10