Domanda

Ho una visualizzazione personalizzata che sto creando che ridimensionerà la dimensione del carattere del suo figlio TextViews per adattarli tutti a una larghezza impostata, in modo che ciascuno si trovi sulla propria linea.Ovviamente ci vorrà la larghezza per capirlo.

Avevo sovrascritto onMeasure() così:

@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() calcola la larghezza della riga di testo più grande e tutto funziona con quella.Questo codice funziona bene per FILL_PARENT E WRAP_CONTENT larghezze, ma si sbaglia quando provo a dare un peso al componente e lascio che imposti automaticamente il suo peso in quel modo.

MeasureSpec.getSize(widthMeasureSpec) ritorna 0, COME getMinimumSuggestedWidth() lo fa anche.Ciò genera un meraviglioso errore di attività che non risponde, poiché lineWidth sarà sempre inferiore a calculateTextWidth() sarebbe mai tornato, quindi il while il ciclo funziona per sempre.Il codice XML che ho utilizzato era essenzialmente questo:

<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>

Capisco perché restituisce 0 - ovviamente, è impostato su 0 - ma come faccio a utilizzare il layout_weight?Sento che è qualcosa che dovrebbe avere una risposta semplice, ma non so di cosa si tratti.

È stato utile?

Soluzione

Ho finito per capirlo attraverso alcune significative ricerche su Google.SU questa pagina ho scoperto che onMeasure viene effettivamente chiamato due volte Quando android:layout_weight è impostato.Ho scoperto più tardi che è menzionato in Come Android disegna le visualizzazioni Quello measure() può essere chiamato un numero qualsiasi di volte, semplicemente non mi è venuto subito in mente.Il primo passaggio ovviamente non può dare un valore per la taglia di ogni bambino, poiché non sa quali sono i pesi di tutti i fratelli di View.Lo esamina una volta e fornisce una larghezza pari a 0 con MeasureSpec.UNSPECIFIED per vedere se il bambino ha vincoli specifici, quindi passa attraverso Ancora per assegnare i pesi effettivi con MeasureSpec.EXACTLY.La mia attività si incasinava al primo passaggio, quindi non è mai arrivata alla fase di layout.Modificando il mio onMeasure() con il codice seguente è stato risolto il problema.

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  int widthMode = MeasureSpec.getMode(widthMeasureSpec);
  if (widthMode != MeasureSpec.UNSPECIFIED) {
    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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top