我有一个我正在创建的自定义视图,它将缩放其子项的字体大小TextViews
以适应所有设置的宽度,因此每个视图都在自己的行上。显然,它需要宽度来解决这个问题。
我onMeasure()
像这样被覆盖:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int lineWidth = widthSize - getPaddingLeft() - getPaddingRight();
// Change the text size until the largest line of text fits.
while (lineWidth < calculateTextWidth()) {
for (TextView textView : this.childViews) {
float newSize = textView.getTextSize() - 1;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, newSize);
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
calculateTextWidth()
计算最大文本行的宽度,一切都适用。这段代码适用于FILL_PARENT
和WRAP_CONTENT
宽度,但是当我尝试给组件一个权重并让它以这种方式自动设置它的权重时会搞砸。
MeasureSpec.getSize(widthMeasureSpec)
返回0
,同样getMinimumSuggestedWidth()
如此。这给出了一个美妙的 Activity Not Responding 错误,因为 lineWidth 总是小于calculateTextWidth()
返回值,所以while
循环永远运行。我使用的 XML 代码本质上是这样的:
<com.my.widgets.ScalingTextViewGroup
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center_horizontal"
>
<TextView
android:id="@+id/text_1"
android:text="Text 1"
android:textSize="20sp" />
<TextView
android:id="@+id/text_2"
android:text="Text 2"
android:textSize="18sp" />
<TextView
android:id="@+id/text_3"
android:text="Text 3"
android:textSize="18sp" />
<TextView
android:id="@+id/text_4"
android:text="Text 4"
android:textSize="18sp" />
</com.my.widgets.ScalingTextViewGroup>
我明白为什么它返回 0 - 显然,它被设置为 0 - 但我如何让它使用layout_weight
?我觉得它应该有一个简单的答案,但我不知道它是什么。