Skip to content

Instantly share code, notes, and snippets.

@nuovothoth
Forked from mrleolink/SingleLineTextView.java
Last active January 13, 2020 15:35
Show Gist options
  • Save nuovothoth/b95983dfa38c2e794cd2570f156faa0a to your computer and use it in GitHub Desktop.
Save nuovothoth/b95983dfa38c2e794cd2570f156faa0a to your computer and use it in GitHub Desktop.
A custom TextView that can shrink its text size to fit in a single line
/**
* Forked from: http://androidxref.com/4.1.1/xref/frameworks/base/core/java/com/android/internal/widget/DialogTitle.java
* Created by LeoLink on 2014-06-30.
*/
import android.annotation.SuppressLint;
import android.content.Context;
import android.support.annotation.Nullable;
import android.text.Layout;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.widget.TextView;
@SuppressLint("AppCompatCustomView")
public class SingleLineTextView extends TextView {
private static final String TAG = SingleLineTextView.class.getSimpleName();
private static final int MIN_TEXT_SIZE = 10;
public SingleLineTextView(Context context) {
super(context);
setSingleLine();
setEllipsize(TextUtils.TruncateAt.END);
}
public SingleLineTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
setSingleLine();
setEllipsize(TextUtils.TruncateAt.END);
}
public SingleLineTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setSingleLine();
setEllipsize(TextUtils.TruncateAt.END);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Layout layout = getLayout();
if (layout != null) {
int lineCount = layout.getLineCount();
if (lineCount > 0) {
boolean isEllipsis = true;
while(isEllipsis) {
int ellipsisCount = layout.getEllipsisCount(lineCount - 1);
float textSize = getTextSize();
if (ellipsisCount > 0 && textSize > MIN_TEXT_SIZE) {
Log.d(TAG, "Text is ellipsized");
// textSize is already expressed in pixels
setTextSize(TypedValue.COMPLEX_UNIT_PX, (textSize - 1));
super.onMeasure(widthMeasureSpec, heightMeasureSpec); //setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
}else{
isEllipsis = false;
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment