Как обрабатывать веса в onMeasue для настраиваемых представлений?

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

6
задан double-beep 21 May 2019 в 11:28
поделиться