From f75775ea7ff25fc9039ce7994312b29419294902 Mon Sep 17 00:00:00 2001 From: Siyamed Sinir Date: Wed, 25 May 2016 11:16:22 -0700 Subject: [PATCH] Fix TextView layout reuse when maxLines is set MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When maxLines is set on StaticLayout and the text is wrapped, during onMeasure TextView couldn’t recognize the wrap in the layout and tried to reuse the layout which in turn caused width calculation problems. This CL checks if maxLines is set, and if there is a text cut-off in order to reuse existing layout. Bug: 28468120 Change-Id: Ide43df8512a09112715067cbadf29cc64fd53247 --- core/java/android/widget/TextView.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index fc120eb0e65fb..3711b9402f3a2 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -6983,14 +6983,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return false; } - private static int desired(Layout layout) { + private static int desired(Layout layout, int maxLines) { int n = layout.getLineCount(); CharSequence text = layout.getText(); float max = 0; + // if maxLines is set, and the text length is greater that the length of the text in the + // layout, it means that there is a cut-off and we cannot use it. + if (maxLines != -1 && text.length() > layout.getLineEnd(n - 1)) { + return -1; + } + // if any line was wrapped, we can't use it. // but it's ok for the last line not to have a newline - for (int i = 0; i < n - 1; i++) { if (text.charAt(layout.getLineEnd(i) - 1) != '\n') return -1; @@ -7063,7 +7068,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener width = widthSize; } else { if (mLayout != null && mEllipsize == null) { - des = desired(mLayout); + des = desired(mLayout, getMaxLines()); } if (des < 0) { @@ -7095,7 +7100,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int hintWidth; if (mHintLayout != null && mEllipsize == null) { - hintDes = desired(mHintLayout); + hintDes = desired(mHintLayout, getMaxLines()); } if (hintDes < 0) {