Textview的maxLines大于1行时,"android:ellipsize="end" 省略号失效,这个问题一直都存在,我查找了很多博客,结合自己的实战经验做出分享,希望帮助更多的同仁们。详细如下:

第一步:在布局文件中加上这两个属性 android:ellipsize="end" 和 android:maxLines="2",假设最多不超过2行.。

第二步:写一个工具类。

package com.kqt.live.commom;

import android.annotation.SuppressLint;
import android.os.Build;
import android.view.ViewTreeObserver;
import android.widget.TextView;

/**
 * Created with Android Studio.
 * User: huanggh
 * Date: 2020/4/23
 * Time: 15:20
 * Desc: maxLine超过1行时,省略号失效问题解决方案
 */
public class TextViewUtil {

    /**
     * 参数:maxLines 要限制的最大行数
     * 参数:content  指TextView中要显示的内容
     */
    public static void setMaxEcplise(final TextView mTextView, final int maxLines, final String content) {


        ViewTreeObserver observer = mTextView.getViewTreeObserver();
        observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                mTextView.setText(content);
                if (mTextView.getLineCount() > maxLines) {
                    int lineEndIndex = mTextView.getLayout().getLineEnd(maxLines - 1);
                    //下面这句代码中:我在项目中用数字3发现效果不好,改成1了

                    String text = content.subSequence(0, lineEndIndex - 3) + "...";
                    mTextView.setText(text);
                } else {
                    removeGlobalOnLayoutListener(mTextView.getViewTreeObserver(), this);
                }
            }
        });
    }


    @SuppressWarnings("deprecation")
    @SuppressLint("NewApi")
    private static void removeGlobalOnLayoutListener(ViewTreeObserver obs, ViewTreeObserver.OnGlobalLayoutListener listener) {
        if (obs == null)
            return;
        if (Build.VERSION.SDK_INT < 16) {
            obs.removeGlobalOnLayoutListener(listener);
        } else {
            obs.removeOnGlobalLayoutListener(listener);
        }
    }
}

 

第三步:在代码中使用。

大功告成,效果如下:

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐