У меня есть пользовательский вид, который я создаю, который будет масштабировать размер шрифта его дочернего элемента 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
? Я чувствую, что это должен быть простой ответ, но я не знаю, что это такое.