使用自动换行文本的TextView的getMeasuredHeight()方法

18

我正在尝试确定一个 TextView 在被绘制之前的高度。我使用以下代码来实现:

TextView textView = (TextView) findViewById(R.id.textview);
textView.setText("TEST");
int widthSpec = MeasureSpec.makeMeasureSpec(LayoutParams.MATCH_PARENT, MeasureSpec.EXACTLY);
int heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
textView.measure(widthSpec, heightSpec);
System.out.println("MeasuredHeight: " + textView.getMeasuredHeight());

输出为MeasuredHeight: 28,没有问题。

然而,当我给TextView一个很长的文本字符串,以至于需要换行时,它仍然给出单行的高度而不是两行:

(...)
textView.setText("TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST");
(...)

输出为MeasuredHeight: 28,而我期望的是MeasuredHeight: 56

为什么它没有给我正确的值,我该如何获得正确的值?


也许这个链接可以帮到你,它几乎是相同的问题! - ObAt
我已经尝试了该线程和这个(https://dev59.com/flPTa4cB1Zd3GeqPiFPe)中提出的解决方案,但它们都有相同的结果。 - nhaarman
这是在 onCreate() 方法中。 - nhaarman
尝试使用post在您的视图之一上发布一个Runnable(在onCreate方法中),并将您当前的代码放在其中。 - user
你试过使用measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)吗? - sherpya
显示剩余2条评论
3个回答

10

这是一个onCreate方法。您的整个视图层次结构尚未被测量和布局。因此,textView的父级不知道它的宽度。这就是为什么textView的尺寸不受其父级尺寸限制的原因。

尝试将您的代码更改为:

int widthSpec = MeasureSpec.makeMeasureSpec(200, MeasureSpec.EXACTLY);

这会使您的TextView宽度等于200像素。

如果您解释一下为什么需要TextView的高度,也许我们就能帮到您。


1
我需要知道 TextView 的高度,以创建扩展动画。特别是,我正在扩展一个包含多个组件的 ViewGroup。为了进行动画,我需要知道要进行动画的高度。起初,ViewGroup 是隐藏的,我将高度设为 0,将可见性设置为 VISIBLE,并逐渐递增高度到测量的高度。 - nhaarman
@Niek:你知道TextView的可用宽度吗?它是否与窗口宽度匹配? - Matthias Robbers
因此,请要求您的ViewGroup测量自身。当您启动动画时,所有其他视图都在屏幕上。您应该知道ViewGroup在那个时候可用的宽度,以便您可以测量其总高度。 - Leonidos
1
我进行了一些实验,并估计了容器的宽度。现在测量的高度显示了正确的值。谢谢! - nhaarman
@nhaarman 你好,你能帮助我们了解如何找到正确的测量高度值吗?我正在尝试做类似的动画。 - Arvin
显示剩余4条评论

4

是的,我最近也遇到了这个问题。最好的方法是创建一个ViewTreeObserver对象,并注册一个ViewTreeObserver.OnGlobalLayoutListener。这将在布局阶段之后和绘制阶段之前调用。此时,您将能够获取TextView的大小。

严格来说,这不是文本本身的大小,而是整个TextView的大小。如果涉及内部填充,则实际文本将小于TextView。

如果您确实需要实际文本的尺寸,请使用textView.getLayout()来获取文本的Layout对象,然后使用layout.getHeight()。


由于各种原因,我无法使用OnGlobalLayoutListener。首先,我需要在布局的其余部分绘制完成后的任意时间测量一个可见性为GONETextView的高度。 - nhaarman

0
你需要创建自定义的TextView并在布局中使用它,使用getActualHeight函数在运行时设置高度。
 public class TextViewHeightPlus extends TextView {
    private static final String TAG = "TextViewHeightPlus";
    private int actualHeight=0;


    public int getActualHeight() {
        return actualHeight;
    }

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

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

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

    }

   @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        actualHeight=0;

        actualHeight=(int) ((getLineCount()-1)*getTextSize());

    }

}

为什么要加上“-1”? - Michael Eilers Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接