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

我试图确定一个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一个长文本string,所以包装发生,它仍然给一个单一的行而不是两个的高度:

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

输出是MeasuredHeight: 28 ,我期望MeasuredHeight: 56

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

Solutions Collecting From Web of "带有包装文本的TextView的getMeasuredHeight()"

这是一个onCreate方法。 您的整个视图层次结构尚未测量和布局。 所以textView的父母不知道它的宽度。 这就是为什么textView的维数不受其父节点的约束。

尝试将您的行更改为:

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

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

如果你解释为什么你需要textview的高度,也许我们将能够帮助你。

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

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

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

您必须创build自定义文本视图并在布局中使用它,并使用getActual高度函数在运行时设置高度

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