logcat 总是报: W/StaticLayout: maxLineHeight should not be -1. maxLines:1 lineCount:1

 这个问题出现的原因是因为xml代码里面设置了:

android:ellipsize="end"
android:lines="1"

如果你设置成:

 android:ellipsize="end"
 android:singleLine="true"

就会不报了,但是如果你的textView 想设置lines 为多行的话,又会在控制台打印那个wraning了,怎么办呢?用下面这个类来解决

import android.content.Context;
import android.graphics.Canvas;
import android.support.v7.widget.AppCompatTextView;
import android.text.Layout;
import android.text.Layout.Alignment;
import android.text.StaticLayout;
import android.text.TextUtils.TruncateAt;
import android.util.AttributeSet;

import java.util.ArrayList;
import java.util.List;

/**
 * @author ChenYe
 */
public class EllipsizingTextView extends AppCompatTextView {
    private static final String ELLIPSIS = "...";

    public interface EllipsizeListener {
        /**
         * 另外这个类还提供了一个监听器EllipsizeListener,这个监听器原文作者说的是开始在Ellipsize(这个单词不知道怎么读,
         * 网上也查不到,估计是Google自创的)的时候调用的,大概意思应该就是说在开始省略(也就是开始 ”...“ )的时候调用,
         * 这个暂时还没有试过,等以后需要的时候再去试一试
         *
         * @param ellipsized
         */
        void ellipsizeStateChanged(boolean ellipsized);
    }

    private final List<EllipsizeListener> ellipsizeListeners = new ArrayList<EllipsizeListener>();
    private boolean isEllipsized;
    private boolean isStale;
    private boolean programmaticChange;
    private String fullText;
    private int maxLines = -1;
    private float lineSpacingMultiplier = 1.0f;
    private float lineAdditionalVerticalPadding = 0.0f;

    public EllipsizingTextView(Context context) {
        super(context);
    }

    public EllipsizingTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

    public void addEllipsizeListener(EllipsizeListener listener) {
        if (listener == null) {
            throw new NullPointerException();
        }
        ellipsizeListeners.add(listener);
    }

    public void removeEllipsizeListener(EllipsizeListener listener) {
        ellipsizeListeners.remove(listener);
    }

    public boolean isEllipsized() {
        return isEllipsized;
    }

    @Override
    public void setMaxLines(int maxLines) {
        super.setMaxLines(maxLines);
        this.maxLines = maxLines;
        isStale = true;
    }

    @Override
    public int getMaxLines() {
        return maxLines;
    }

    @Override
    public void setLineSpacing(float add, float mult) {
        this.lineAdditionalVerticalPadding = add;
        this.lineSpacingMultiplier = mult;
        super.setLineSpacing(add, mult);
    }

    @Override
    protected void onTextChanged(CharSequence text, int start, int before, int after) {
        super.onTextChanged(text, start, before, after);
        if (!programmaticChange) {
            fullText = text.toString();
            isStale = true;
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (isStale) {
            super.setEllipsize(null);
            resetText();
        }
        super.onDraw(canvas);
    }

    private void resetText() {
        int maxLines = getMaxLines();
        String workingText = fullText;
        boolean ellipsized = false;
        if (maxLines != -1) {
            Layout layout = createWorkingLayout(workingText);
            if (layout.getLineCount() > maxLines) {
                workingText = fullText.substring(0, layout.getLineEnd(maxLines - 1)).trim();
                while (createWorkingLayout(workingText + ELLIPSIS).getLineCount() > maxLines) {
                    int lastSpace = workingText.lastIndexOf(' ');
                    if (lastSpace == -1) {
                        break;
                    }
                    workingText = workingText.substring(0, lastSpace);
                }
                workingText = workingText + ELLIPSIS;
                ellipsized = true;
            }
        }
        if (!workingText.equals(getText())) {
            programmaticChange = true;
            try {
                setText(workingText);
            } finally {
                programmaticChange = false;
            }
        }
        isStale = false;
        if (ellipsized != isEllipsized) {
            isEllipsized = ellipsized;
            for (EllipsizeListener listener : ellipsizeListeners) {
                listener.ellipsizeStateChanged(ellipsized);
            }
        }
    }

    private Layout createWorkingLayout(String workingText) {
        return new StaticLayout(workingText, getPaint(), getWidth() - getPaddingLeft() - getPaddingRight(),
                Alignment.ALIGN_NORMAL, lineSpacingMultiplier, lineAdditionalVerticalPadding, false);
    }

    @Override
    public void setEllipsize(TruncateAt where) {
        // Ellipsize settings are not respected
    }
}

我先贴出用法,然后再来解释出处,用法如下(那些*****号代表你的包路径,你应该懂的):

 <******EllipsizingTextView
                android:id="@+id/gznr_tv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#006f6b"
                android:textSize="14sp" />

这样在xml里面设置之后,就不会打印warnging 了,但是即使你在xml里面设置了ellipsize = "end" 和maxLines 的值,你也看不到省略号,往往我们就需要这些省略号来让界面看起来舒畅一些,那么你需要在代码里面进行设置maxLines并且不需要设置ellipsize 值 ,这样就达到你想要的省略号效果啦。代码如下:

 ZgPlanEntity entity = mDataList.get(position);
 EllipsizingTextView gznr = (EllipsizingTextView) holder.getView(R.id.gznr_tv);
 gznr.setMaxLines(2);
 gznr.setText(entity.getGznr());

出处:

我先是搜到了  https://blog.csdn.net/fengkuanghun/article/details/8351149  这篇文章看到了打印warnging 的原因和解决办法,并且在这篇文章里面提到了 Stack-Overflow 的一个地址(https://stackoverflow.com/questions/2160619/android-ellipsize-multiline-textview),这里面也讲到了这个。最后我自己在 Stack-Overflow 的另外一个网址(https://stackoverflow.com/questions/49416089/android-textview-getting-w-staticlayout-maxlineheight-should-not-be-1-maxli)里面 学习到了最开始的解决办法,就是如果是一行的文字想不要打印warning 并且还有缩略号效果的话就使用 ellipsize = "end" 和singLine = "true"的办法来实现,然后如果你的文字要显示多行并且还有缩略号的话,我就用了我上面贴的自定义控件的方式实现得。。。。。。。求赞,哈哈!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值