如何知道某个字符串的 TextView 的大小

How to know what size a TextView WOULD be with certain string

也许我没有输入正确的关键字,但我没有找到答案。我想知道如果我用某个字符串设置 TextView 的尺寸是多少。但是,我想在 activity.

中列出所有内容之前先了解一下

我的 TextView 具有固定宽度和可变高度。我可以得到这样的高度:

myTextView.setText(myString);

// ... UI gets laid out ...

myTextView.getHeight()

我想在高度超过某个点时更改 TextView 的宽度。 (但不是在那之前。)而不是等到 UI 布局之后,我想事先知道如果它有 myString 的高度是多少,然后根据需要更改宽度。

我查看了 Layout class 但我不知道该怎么做。我想知道它是否与覆盖 TextView 的 onMeasure 有关,但我真的不知道如何尝试。感谢任何帮助。

更新

感谢@user3249477 和@0xDEADC0DE 的回答。我将@user3249477 的答案标记为目前的解决方案(虽然因为我需要多次调整视图大小,所以我不确定是否要反复打开和关闭可见性),但也 +1 到 @0xDEADC0DE 给我我需要的关键字进一步研究这个问题。

我需要对此做更多的研究和测试。以下是到目前为止我发现有用的一些链接:

OnLayoutChangeListener:

measureText() 和 getTextBounds():

覆盖父视图的 onSizeChanged 看起来也很有趣:

您可以在不覆盖的情况下完成。如果你用 getPaint() 得到 TextViews Paint,你可以使用 measureText(string) 在用那个 [= 绘制时得到 TextView 的最小值13=]。我看起来像这样:

TextView textView = new TextView(this);
float textWidth = textView.getPaint().measureText("Some Text");

更新
要获得高度,您可以像这样在 Paint 对象上调用 getTextBounds()

    String text = "Some Text";
    Rect textBounds = new Rect();
    textView.getPaint().getTextBounds(text, 0, text.length(), textBounds);
    float height = textBounds.height();
    float width = textBounds.width();

将您的 TextView 设置为不可见:

android:visibility="invisible"

并测量它。完成后将其设置为可见:

TextView myTextView = (TextView) findViewById(R.id.text);
final int maxHeight = 500;
myTextView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom,
                               int oldLeft, int oldTop, int oldRight, int oldBottom) {
        v.removeOnLayoutChangeListener(this);

        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v.getLayoutParams();
        Log.e("TAG", "H: " + v.getHeight() + " W: " + v.getWidth());

        if (v.getWidth() > maxHeight) {
            params.width += 100;
            v.setLayoutParams(params);
        }
        v.setVisibility(View.VISIBLE);
    }
});