如何知道某个字符串的 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:
- View.OnLayoutChangeListener
- Capture Layout resize before API 11
- After changing a property on a LayoutParams object, do I need to call setLayoutParams again?
measureText() 和 getTextBounds():
- Android Paint: .measureText() vs .getTextBounds()
- Paint.getTextBounds() returns to big height
- Gettextbounds in android
覆盖父视图的 onSizeChanged 看起来也很有趣:
您可以在不覆盖的情况下完成。如果你用 getPaint()
得到 TextView
s 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);
}
});
也许我没有输入正确的关键字,但我没有找到答案。我想知道如果我用某个字符串设置 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:
- View.OnLayoutChangeListener
- Capture Layout resize before API 11
- After changing a property on a LayoutParams object, do I need to call setLayoutParams again?
measureText() 和 getTextBounds():
- Android Paint: .measureText() vs .getTextBounds()
- Paint.getTextBounds() returns to big height
- Gettextbounds in android
覆盖父视图的 onSizeChanged 看起来也很有趣:
您可以在不覆盖的情况下完成。如果你用 getPaint()
得到 TextView
s 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);
}
});