【问题标题】:getMeasuredHeight() of TextView with wrapped text带有包装文本的 TextView 的 getMeasuredHeight()
【发布时间】:2013-01-17 19:27:56
【问题描述】:

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

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

【问题讨论】:

  • 也许 [this][1] 会帮助你,这几乎是同样的问题! [1]:stackoverflow.com/questions/6157652/…
  • 我已经在该线程和这个线程 (stackoverflow.com/questions/4668939/…) 中尝试了建议的解决方案,但结果相同。
  • 您在哪里使用了该代码?
  • 这是在onCreate() 方法中。
  • 尝试在您的一个视图上发布(使用postRunnable(在onCreate 方法中)并将您当前的代码放在那里。

标签: android android-layout


【解决方案1】:

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

尝试将您的线路更改为:

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

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

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

【讨论】:

  • 现在它确实给出了 >28 的高度,但显然 TextView 不是 200px 宽。
  • 我需要知道TextView 的高度才能创建展开动画。特别是,我正在扩展一个包含多个组件的ViewGroup。对于动画,我需要知道动画的高度。一开始ViewGroupGONE,我将高度设置为0,将可见性设置为VISIBLE,然后逐渐增加高度到测量高度。
  • @Niek:你知道TextView 的可用宽度吗?它可能与窗口宽度匹配吗?
  • 没有。旁边有一个ImageView,还有好几层的margin。
  • 我做了一些实验,估计了容器的宽度。现在测量的高度确实显示了正确的值。谢谢!
【解决方案2】:

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

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

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

【讨论】:

  • 由于各种原因,我无法使用OnGlobalLayoutListener。一方面,我需要在绘制其余布局后的随机时间点测量具有可见性GONETextView 的高度。
【解决方案3】:

您必须创建自定义 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());

    }

}

【讨论】:

  • 为什么是“-1”?
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多