2013-11-20 148 views
28

我有一个嵌套的布局类似如下: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内的项目时,动画效果变得很奇怪(基本上,子2会跳起来,而子1仍然在动画中)。

有没有人有任何想法如何解决这个问题?

感谢

UPDATE

不久我张贴了这个问题之后,我发现这对LayoutTransition API在Android开发者的网站。

由于各种布局级别的相互关系,在嵌套视图层次的多个级别使用LayoutTransition可能不起作用。

那么有没有人有任何解决此问题的建议?

回答

63

animateLayoutChanges属性利用LayoutTransitions,它将布局的子元素以及从Android 4.0开始,布局层次结构中的祖先一直动画到树顶部。在Honeycomb中,只有布局的孩子会被动画。详情请参阅this Android Developers Blog post

不幸的是,目前似乎没有简单的方法让布局的兄弟姐妹对其LayoutTransitions做出反应。您可以尝试使用TransitionListener在布局边界被更改时得到通知,并使用动画设计器相应地移动同级视图。参见Chet Haase在this Google+ post的第二个答案。

编辑 - 原来那里的一种方法。在Android 4.1+(API级别16+)中,您可以使用默认禁用的布局转换类型CHANGING。为了使它能够在代码:

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

所以,在你的榜样,有小孩2布局的动画,你需要使CHANGING布局改造它。这个转换将会在父代的边界发生变化时被应用。

请参阅this DevBytes video了解更多详情。

+0

感谢您的回答,我会试一试。 – Chen

+0

我确实尝试了这一点,但在我的情况下效果并不理想,我认为将enableTransitionType设置为更改类似于将animateLayoutChanges标志设置为true的效果。无论如何,我转向另一种方法,因此不再需要动画化嵌套布局。 – Chen

+0

嘿! @陈,你解决了你的问题吗? – Vijju

1

似乎父母的延迟转换也适用于动画。至少对我来说,下面的代码给出了一个正确的展开/折叠动画。

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

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

对于你有时可能需要在调用TransitionManager使用父上涨的深层次嵌套布局。

1

我们已经将android:animateLayoutChanges属性添加到了我们的LinearLayout,但该更改未触发动画。为了解决这个问题,使用此代码:

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

More details