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