我正在尝试确定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
。
为什么它不能给我正确的价值,我怎样才能达到正确的价值?
答案 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());
}
}