获取textview行数

Posted jasonkent27

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取textview行数相关的知识,希望对你有一定的参考价值。

获取textview行数

代码

import android.content.Context;
import android.graphics.Canvas;
import android.text.Layout;
import android.text.Layout.Alignment;
import android.text.StaticLayout;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.TextView;


/**
 * @author jasonkent27
 *
 * TextView第二行文字超过一半则自动略去,并添加省略号
 */
public class CustomWidgetTextView extends TextView {

    private float mLineSpacingMultiplier = 1.0f;
    private float mLineAdditionalVerticalPadding = 0.0f;
    /**
     * setText时需要置为true
     */
    private boolean mNeedResetText = true ;

    public CustomWidgetTextView(Context context) {
        this(context, null);
    }

    public CustomWidgetTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomWidgetTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected final void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        mNeedResetText = true ;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (mNeedResetText) {
            resetText();
            mNeedResetText = false ;
        }
        super.onDraw(canvas);
    }

    /**
     * 重TextView内部文字渲染逻辑
     */
    private void resetText() {

        if (!TextUtils.isEmpty(getText())) {

            String origText = getText().toString();
            String firstLineText ;
            String secondLineText ;
            String resultText = origText ;

            Layout layout = createRenderLayout(origText, getWidth() - getPaddingLeft() - getPaddingRight());
            if (layout.getLineCount() > 1) {
                //取出第一,二行文字
                firstLineText = origText.substring(0, layout.getLineEnd(0));
                secondLineText = origText.substring(layout.getLineEnd(0)+1, layout.getLineEnd(1));

                Layout layout2 = createRenderLayout(secondLineText, (getWidth() - getPaddingLeft() - getPaddingRight()) / 2);
                //第二行文字长度过半,则截断并且添加省略符
                if (layout2.getLineCount() > 1) {
                    secondLineText = secondLineText.substring(0, layout2.getLineEnd(0)) + "...";
                }
                resultText = firstLineText + secondLineText ;
            }
            setText(resultText);
        }
    }

    /**
     * @param workingText
     * @param width
     * @return StaticLayout @See https://developer.android.com/reference/android/text/StaticLayout.html
     */
    private Layout createRenderLayout(CharSequence workingText, int width) {
        return new StaticLayout(
                workingText,
                getPaint(),
                width,
                Alignment.ALIGN_NORMAL,
                mLineSpacingMultiplier,
                mLineAdditionalVerticalPadding,
                false );
    }
}

以上是关于获取textview行数的主要内容,如果未能解决你的问题,请参考以下文章

片段 TextView 无法从 parcelable 对象更新

UITextView iOS 7的行数

Android:TextView最小行数设置

获取UItextView中的行数

Android带下划线的TextView

在 AsyncTask 中将新的 TextView 设置为片段