带有包装文本的TextView的getMeasuredHeight()

时间:2013-01-17 19:27:57

标签: android android-layout

我正在尝试确定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

为什么它不能给我正确的价值,我怎样才能达到正确的价值?

3 个答案:

答案 0 :(得分:10)

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

尝试将您的行更改为:

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

因此它使您的textview宽度等于200像素。

如果你解释为什么你需要textview的高度,我们可以帮助你。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分: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());

    }

}