ho avuto un problema simile con una situazione simile.
Ho dovuto creare un'animazione per cui ho richiesto l'altezza dello view
soggetto all'animazione. All'interno di tale view
, che è un LinearLayout
potrebbe essere una vista secondaria di tipo TextView
. Che TextView
è una linea multipla e il numero di righe effettivamente richiesto varia.
Qualunque cosa facessi, ho appena ottenuto l'altezza misurata per la vista, come se lo TextView
avesse solo una linea da riempire. Non c'è da meravigliarsi se questo ha funzionato bene ogni volta che il testo è risultato abbastanza breve per una singola riga, ma non ha funzionato quando il testo era più lungo.
Ho considerato questa risposta: https://stackoverflow.com/a/6157820/854396 Ma quello non ha funzionato troppo bene per me perché non sono in grado di accedere allo TextView
incorporato direttamente da qui. (Avrei potuto iterato anche se l'albero della vista dei bambini però.)
Dai un'occhiata alla mia codice come funziona, per ora:
view
è la vista che deve essere animato. È un LinearLayout
(La soluzione finale sarà un po 'più di tipo salva qui) this
è una vista personalizzata che contiene view
e eredita anche da LinearLayout
.
private void expandView(final View view) {
view.setVisibility(View.VISIBLE);
LayoutParams parms = (LayoutParams) view.getLayoutParams();
final int width = this.getWidth() - parms.leftMargin - parms.rightMargin;
view.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
final int targetHeight = view.getMeasuredHeight();
view.getLayoutParams().height = 0;
Animation anim = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation trans) {
view.getLayoutParams().height = (int) (targetHeight * interpolatedTime);
view.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
};
anim.setDuration(ANIMATION_DURATION);
view.startAnimation(anim);
}
Questo era quasi ma ho fatto un altro errore. All'interno della gerarchia delle viste sono coinvolte due viste personalizzate che sono sottoclassi di LinearLayout
e il loro xml è unito con un tag merge
come tag radice xml. All'interno di uno di questi tag merge
ho trascurato di impostare l'attributo android:orientation
su vertical
. Questo non ha preoccupato troppo per il layout stesso, perché all'interno di questo unificato ViewGroup
era solo un figlio ViewGroup
e quindi non ho potuto effettivamente vedere l'orientamento sbagliato sullo schermo. Ma era lì e in qualche modo ha rotto un po 'questa logica di misura del layout.
In aggiunta a quanto sopra, potrebbe essere necessario eliminare tutti i padding associati a LinearLayout
s e sottoclassi all'interno della gerarchia di viste. Sostituiscili con i margini, anche se devi avvolgere un altro layout intorno per renderlo uguale.
Infatti l'altezza restituita da getMeasuredSpec è diversa. Al momento 34 vs 137. Ho modificato il mio primo messaggio con qualche altra informazione. – anonymous
Vedi la mia nuova risposta. – Fixpoint
Questa risposta è la risposta giusta, ma la mancanza di codice è la semplice ragione per meno upvotes. – Warpzit