Fix ExpandableTextView recursively call setText (#2252)

This commit is contained in:
Howard Wu 2022-11-29 22:19:44 +08:00 committed by GitHub
parent fd1c51e027
commit f5aee25427
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 31 additions and 20 deletions

View File

@ -19,6 +19,7 @@
package org.lsposed.manager.ui.widget; package org.lsposed.manager.ui.widget;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.os.Bundle; import android.os.Bundle;
@ -49,6 +50,7 @@ public class ExpandableTextView extends MaterialTextView {
private final SpannableString collapse; private final SpannableString collapse;
private final SpannableString expand; private final SpannableString expand;
private final SpannableStringBuilder sb = new SpannableStringBuilder(); private final SpannableStringBuilder sb = new SpannableStringBuilder();
private int lineCount = 0;
public ExpandableTextView(Context context) { public ExpandableTextView(Context context) {
this(context, null); this(context, null);
@ -89,29 +91,44 @@ public class ExpandableTextView extends MaterialTextView {
@Override @Override
public boolean onPreDraw() { public boolean onPreDraw() {
var lineCount = getLayout().getLineCount(); this.getViewTreeObserver().removeOnPreDrawListener(this);
if (lineCount == 0) {
lineCount = getLayout().getLineCount();
}
if (lineCount > maxLines) { if (lineCount > maxLines) {
SpannableString s; int hintTextOffsetEnd;
int end;
if (maxLines == getMaxLines()) { if (maxLines == getMaxLines()) {
nextLines = lineCount + 1; nextLines = lineCount + 1;
end = getLayout().getLineStart(getMaxLines() - 1); hintTextOffsetEnd = getLayout().getLineStart(getMaxLines() - 1);
s = expand; setTextWithSpan(text, hintTextOffsetEnd - 1, expand);
} else { } else if (nextLines == getMaxLines()) {
nextLines = maxLines; nextLines = maxLines;
end = text.length() + 1; hintTextOffsetEnd = getLayout().getLineStart(getMaxLines() - 1);
s = collapse; setTextWithSpan(text, hintTextOffsetEnd, collapse);
} }
sb.clearSpans();
sb.clear();
sb.append(text, 0, end - 1);
sb.append("\n");
sb.append(s);
super.setText(sb, BufferType.NORMAL);
} }
return super.onPreDraw(); return super.onPreDraw();
} }
private void setTextWithSpan(CharSequence text, int textOffsetEnd,
SpannableString sbStr) {
sb.clearSpans();
sb.clear();
sb.append(text, 0, textOffsetEnd);
sb.append("\n");
sb.append(sbStr);
super.setText(sb, BufferType.NORMAL);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (getLayout() != null) {
lineCount = getLayout().getLineCount();
}
}
@SuppressLint("ClickableViewAccessibility")
@Override @Override
public boolean onTouchEvent(@NonNull MotionEvent event) { public boolean onTouchEvent(@NonNull MotionEvent event) {
Layout layout = this.getLayout(); Layout layout = this.getLayout();
@ -127,7 +144,6 @@ public class ExpandableTextView extends MaterialTextView {
if (links.length == 0) { if (links.length == 0) {
return false; return false;
} else { } else {
performClick();
return super.onTouchEvent(event); return super.onTouchEvent(event);
} }
} }
@ -136,11 +152,6 @@ public class ExpandableTextView extends MaterialTextView {
return false; return false;
} }
@Override
public boolean performClick() {
return super.performClick();
}
@Override @Override
public Parcelable onSaveInstanceState() { public Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();