Refactor marquee setup for multi-line TextViews

This commit is contained in:
ssaqua 2019-04-20 14:21:35 +12:00 committed by Martijn Brekhof
parent 2706210cef
commit 53e1a62afe
3 changed files with 39 additions and 52 deletions

View File

@ -35,7 +35,6 @@ import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.NestedScrollView;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.TextViewCompat;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
@ -375,31 +374,7 @@ abstract public class AbstractInfoFragment extends AbstractFragment
@SuppressLint("StringFormatInvalid")
protected void updateView(DataHolder dataHolder) {
titleTextView.setText(dataHolder.getTitle());
titleTextView.post(new Runnable() {
@Override
public void run() {
int lines = titleTextView.getLineCount();
int maxLines = TextViewCompat.getMaxLines(titleTextView);
if (lines > maxLines) {
titleTextView.setEllipsize(TextUtils.TruncateAt.END);
titleTextView.setClickable(true);
titleTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setSelected(!v.isSelected());
TextUtils.TruncateAt ellipsize;
if (v.isSelected()) {
ellipsize = TextUtils.TruncateAt.MARQUEE;
} else {
ellipsize = TextUtils.TruncateAt.END;
}
titleTextView.setEllipsize(ellipsize);
titleTextView.setHorizontallyScrolling(v.isSelected());
}
});
}
}
});
titleTextView.post(UIUtils.getMarqueeToggleableAction(titleTextView));
underTitleTextView.setText(dataHolder.getUnderTitle());
detailsRightTextView.setText(dataHolder.getDetails());

View File

@ -20,7 +20,6 @@ import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.widget.TextViewCompat;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
@ -753,31 +752,7 @@ public class NowPlayingFragment extends Fragment
}
mediaTitle.setText(title);
mediaTitle.post(new Runnable() {
@Override
public void run() {
int lines = mediaTitle.getLineCount();
int maxLines = TextViewCompat.getMaxLines(mediaTitle);
if (lines > maxLines) {
mediaTitle.setEllipsize(TextUtils.TruncateAt.END);
mediaTitle.setClickable(true);
mediaTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setSelected(!v.isSelected());
TextUtils.TruncateAt ellipsize;
if (v.isSelected()) {
ellipsize = TextUtils.TruncateAt.MARQUEE;
} else {
ellipsize = TextUtils.TruncateAt.END;
}
mediaTitle.setEllipsize(ellipsize);
mediaTitle.setHorizontallyScrolling(v.isSelected());
}
});
}
}
});
mediaTitle.post(UIUtils.getMarqueeToggleableAction(mediaTitle));
mediaUndertitle.setText(underTitle);
mediaProgressIndicator.setOnProgressChangeListener(this);

View File

@ -29,6 +29,7 @@ import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.TextViewCompat;
import android.support.v7.app.AlertDialog;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
@ -612,6 +613,42 @@ public class UIUtils {
}
}
/**
* Returns a {@link Runnable} that sets up toggleable scrolling behavior on a {@link TextView}
* if the number of lines to be displayed exceeds the maximum lines limit supported by the TextView.
* Can be applied by using {@link View#post(Runnable)}.
*
* @param textView TextView that the Runnable should apply against
* @return Runnable
*/
public static Runnable getMarqueeToggleableAction(final TextView textView) {
return new Runnable() {
@Override
public void run() {
int lines = textView.getLineCount();
int maxLines = TextViewCompat.getMaxLines(textView);
if (lines > maxLines) {
textView.setEllipsize(TextUtils.TruncateAt.END);
textView.setClickable(true);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setSelected(!v.isSelected());
TextUtils.TruncateAt ellipsize;
if (v.isSelected()) {
ellipsize = TextUtils.TruncateAt.MARQUEE;
} else {
ellipsize = TextUtils.TruncateAt.END;
}
textView.setEllipsize(ellipsize);
textView.setHorizontallyScrolling(v.isSelected());
}
});
}
}
};
}
/**
* Replaces some BBCode-ish tagged text with styled spans.
* <p>