18

我试图在绘制TextView 之前确定 a 的高度。我正在使用以下代码来做到这一点:

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的。

为什么它没有给我正确的价值,我怎样才能获得正确的价值?

4

3 回答 3

10

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

尝试将您的线路更改为:

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

所以它使你的 textview 宽度等于 200 像素。

如果您解释为什么需要 textview 的高度,也许我们可以为您提供帮助。

于 2013-01-17T20:40:35.277 回答
4

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

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

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

于 2013-01-17T20:31:37.240 回答
0

您必须创建自定义 Textview 并在您的布局中使用它并使用 getActual height 函数在运行时设置高度

 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());

    }

}
于 2013-10-24T11:39:44.017 回答