Android文本在固定高度的TextView上被截断

时间:2019-03-25 21:28:30

标签: android android-layout

考虑此布局:

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="160dp"
    android:textSize="20sp"
    android:text="Apple Inc. is an American multinational technology company headquartered in Cupertino, California, that designs, develops, and sells consumer electronics, computer software, and online services."
    android:ellipsize="end"
    android:gravity="top"/>

我希望TextView可以计算出160dp可以容纳多少行,如果空间不足,可以放置三个点。但是,文本被截断了: enter image description here

如何实现上述行为?我假设可以通过在布局资源文件上指定一些属性来做到这一点。谢谢。

1 个答案:

答案 0 :(得分:1)

没有办法通过简单地在布局资源文件上指定属性来实现。

如果您查看setEllipsize()中的TextView方法,您会看到它说:

  

使文本中长于视图宽度的单词变为椭圆形,而不是在中间断开。您可能还需要setSingleLine()或setHorizo​​ntallyScrolling(boolean)将文本限制为一行。使用null可以关闭椭圆化。如果使用setMaxLines(int)设置两行或更多行,则仅支持TextUtils.TruncateAt.END和TextUtils.TruncateAt.MARQUEE(其他省略号类型将不起作用)。

从该文档中,您可以看到TextView中的省略号实际上高度取决于两个因素:视图宽度行数

这样,我记得如果TextView不知道TextView可以拥有的最大行数,则省略号可能不会出现。

因此对于您预期的行为,这是不可能的,因为您取决于视图的高度。您要使用特定的高度,然后让TextView计算可以在该高度内显示的行数。最后,如果所需的行数大于显示的行数,则要显示椭圆。

TextView中的省略号进行编码是不可能的。这根本不是为了那个。

因此,如果您想要这种行为,则需要:

  1. 为您的特定椭圆实现创建自定义TextView

  2. 手动计算可见行的数量,然后在该setMaxLines()上使用TextView

对于第二个选项,您可以使用TextView方法getHeight()getLineHeight()进行计算。

例如:

textview = (TextView) findViewById(R.id.exampleTextView);

textview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        final int maxLines = textview.getHeight() / textview.getLineHeight();
        textview.setMaxLines(maxLines);
    }
});

在我的示例中,我正在ViewTreeObserver内执行此操作,以避免getHeight()调用大小为0的

第二个选项应该能够获得所需的行为,但是如果每个TextView都需要这样做,则应考虑创建自定义TextView