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 ellipsizeListeners = new ArrayList(); 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"的办法来实现,然后如果你的文字要显示多行并且还有缩略号的话,我就用了我上面贴的自定义控件的方式实现得。。。。。。。求赞,哈哈!
更多相关文章
- EditText设置更多文字为省略号
- Textview的maxLines大于1行时,"android:ellipsize="end" 省略号失
- Android视频图片缩略图的获取
- android视频录制(调用系统视频录制),生成缩略图
- Android 获取缩略图
- 2011.09.29(2)——— android 图片缩略图
- android为图片生成缩略图
- Android 获得图片并解码成缩略图以减少内存消耗
- android textview 中超出屏幕宽度的字符 省略号显示
随机推荐
- android中textview设置为多行文本时,如何
- Android:BadTokenException: Unable to ad
- 2013.08.29——— android ObjectAnimato
- 很好的资源 for android
- Android(安卓)复习笔记之图解Service
- android 应用程序不出现在最近打开程序列
- Android: Your JS Engine is not always
- android 开发中总结的一些经验
- Android(安卓)Studio : Rendering Proble
- Android: Your JS Engine is not always