私が作成しているカスタムビューがあります。これは、子のフォントサイズを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()
。lineWidth は常に返されるよりも小さいcalculateTextWidth()
ため、while
ループは永久に実行されるため、これにより素晴らしい Activity Not Responding エラーが発生します。私が使用した 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
か? 単純な答えがあればいいような気がするのですが、それが何なのか途方に暮れています。