2013-11-20 12 views
28

Ich habe eine verschachtelte Layout wie folgt aus:animateLayoutChanges funktioniert nicht gut mit verschachteltem Layout?

<LinearLayout>  <!----Parent layout---> 
    <LinearLayout> <!-----child 1---> 
     ... 
    </LinearLayout> <!----child 1 ended---> 
    <LinearLayout> <!-----child 2---> 
     ... 
    </LinearLayout> <!----child 2 ended---> 
</LinearLayout> <!----Parent endded---> 

Das Problem, das ich jetzt habe, ist, dass da alle meine Daten Artikel innerhalb Kind 1 oder Kind sind 2 Linearlayout, wenn ich hinzufügen oder ein Element Linearlayout das Kind löschen wird mit dem Effekt animateLayoutChanges animiert, aber das übergeordnete Layout wird keine Animation ausführen. (Ich habe android:animateLayoutChanges auf true für alle linearen Layouts festgelegt). Besonders wenn ich ein Objekt in Kind 1 lösche, wird der Animationseffekt merkwürdig (im Prinzip wird Kind 2 aufspringen, während Kind 1 noch seine Animation macht).

Hat jemand eine Idee, wie man das löst?

Dank

UPDATE

Kurz nachdem ich diese Frage gestellt, fand ich diese vor Ort Android-Entwickler in der LayoutTransition API.

Die Verwendung von LayoutTransition auf mehreren Ebenen einer geschachtelten Ansichtshierarchie funktioniert möglicherweise nicht, da die verschiedenen Ebenen des Layouts miteinander verknüpft sind.

Hat also jemand Arbeit um Vorschläge für dieses Problem?

Antwort

63

Die animateLayoutChanges-Eigenschaft verwendet LayoutTransitions, die sowohl die untergeordneten Elemente des Layouts als auch ab Android 4.0 Vorfahren in der Layouthierarchie bis zum Anfang der Struktur animieren. In Honeycomb werden nur die Kinder des Layouts animiert. Details siehe this Android Developers Blog post.

Leider scheint es derzeit keine einfache Möglichkeit zu geben, die Geschwister eines Layouts auf seine LayoutTransitions zu reagieren. Sie können versuchen, eine TransitionListener zu verwenden, um benachrichtigt zu werden, wenn die Grenzen des Layouts geändert werden, und die Geschwisteransichten mithilfe von Animatoren entsprechend zu verschieben. Siehe Chet Haases zweite Antwort in this Google+ post.

BEARBEITEN - Es erscheint ist ein Weg. In Android 4.1+ (API-Ebene 16+) können Sie einen Layoutübergangstyp CHANGING verwenden, der standardmäßig deaktiviert ist. Um es in Code zu aktivieren:

ViewGroup layout = (ViewGroup) findViewById(R.id.yourLayout); 
LayoutTransition layoutTransition = layout.getLayoutTransition(); 
layoutTransition.enableTransitionType(LayoutTransition.CHANGING); 

Also, in Ihrem Beispiel zu Kind 2 Layout animiert hat, dann würden Sie brauchen die CHANGING Layout-Transformation für sie zu aktivieren. Die Transformation würde dann angewendet werden, wenn sich die Grenzen des übergeordneten Elements ändern.

Weitere Details finden Sie unter this DevBytes video.

+0

Danke für die Antwort werde ich es versuchen. – Chen

+0

Ich habe dies versucht und es funktioniert nicht wirklich gut in meiner Situation, ich denke, set enableTransitionType zu ändern hat einen ähnlichen Effekt, als das Flag animateLayoutChanges auf wahr gesetzt. Wie auch immer, ich bin zu einem anderen Ansatz übergegangen, so dass das Animieren verschachtelter Layouts nicht länger benötigt wird. – Chen

+0

Hey! @Chen, hast du dein Problem gelöst? – Vijju

1

Es scheint, dass ein verzögerter Übergang auf dem Eltern auch zum Animieren funktioniert. Zumindest für mich gibt der folgende Code eine richtige Expand/Collapse Animation.

expandTrigger.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     TransitionManager.beginDelayedTransition(parentLayout); 
     expanded = !expanded; 

     child1.setVisibility(expanded ? View.VISIBLE : View.GONE); 
    } 
}); 

Für tief verschachtelten Layouts Sie manchmal ein Elternteil höher in der Hierarchie in dem Aufruf der TransitionManager verwenden benötigen.

1

Wir hatten das Attribut android: animateLayoutChanges zu unserem LinearLayout hinzugefügt, aber die Änderung hat keine Animation ausgelöst. Um dies zu beheben, verwenden Sie diesen Code:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
((ViewGroup) findViewById(R.id.llRoot)).getLayoutTransition() 
     .enableTransitionType(LayoutTransition.CHANGING); 
} 

More details.

Verwandte Themen