web-dev-qa-db-ja.com

animateLayoutChangesはネストされたレイアウトではうまく機能しませんか?

次のようなネストされたレイアウトがあります。

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

私が今抱えている問題は、すべてのデータ項目が子1または子2 Linearlayout内にあるため、項目を追加または削除すると、子linearlayoutはanimateLayoutChangesの効果でアニメーション化されますが、親レイアウトはアニメーションを実行します。 (私が持っています Android:animateLayoutChangesすべての線形レイアウトでtrueに設定)。特に、子1内のアイテムを削除すると、アニメーション効果がおかしくなります(基本的に、子1がまだアニメーションを実行している間に子2がジャンプします)。

誰もこれを解決する方法を知っていますか?

ありがとう

[〜#〜] update [〜#〜]

この質問を投稿してまもなく、Android LayoutTransition APIの開発者向けサイトで見つけました。

ネストされたビュー階層の複数のレベルでLayoutTransitionを使用すると、レイアウトのさまざまなレベルの相互関係のために機能しない場合があります。

だから、誰もこの問題の提案に対処していますか?

40
Chen

animateLayoutChangesプロパティはLayoutTransitionsを使用します。これは、レイアウトの子と、Android 4.0以降、レイアウト階層の先祖の両方をアニメーション化するツリーのトップ。ハニカムでは、レイアウトの子のみがアニメーション化されます。詳細については、 this Android Developers Blog post を参照してください。

残念ながら、現在、レイアウトの兄弟をそのLayoutTransitionsに反応させる簡単な方法はないようです。 TransitionListenerを使用してレイアウトの境界が変更されたときに通知を受け取り、アニメーターを使用してそれに応じて兄弟ビューを移動してみてください。 this Google+ post のChet Haaseの2番目の回答を参照してください。

[〜#〜] edit [〜#〜]-そこに判明is方法です。 Android 4.1+(APIレベル16+)では、デフォルトで無効になっているレイアウト遷移タイプCHANGINGを使用できます。コードで有効にするには:

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

したがって、この例では、子2レイアウトをアニメーション化するには、CHANGINGレイアウト変換を有効にする必要があります。その変換は、親の境界に変化があるときに適用されます。

このDevBytesビデオ を参照してください。

79
Timo Hildén

Android:animateLayoutChanges属性をLinearLayoutに追加しましたが、変更はアニメーションをトリガーしませんでした。これを修正するには、次のコードを使用します。

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

詳細

5
beokh

親の遅延トランジションもアニメーション化に役立つようです。少なくとも私にとって、次のコードは適切な展開/折りたたみアニメーションを提供します。

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

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

深くネストされたレイアウトの場合、TransitionManagerの呼び出しで、階層の上位にある親を使用する必要がある場合があります。

1
sihaya