LinearLayout中Fragment淡入淡出动画异常问题求助
解决LinearLayout中Fragment淡入淡出动画异常的问题
我之前也碰到过一模一样的情况,核心问题是LinearLayout里的Fragment容器高度设置导致布局提前调整,打断了退出动画的执行。当你用match_parent作为容器高度时,LinearLayout会强制容器适配父布局空间,切换Fragment时系统会先把容器高度调整为新Fragment的尺寸,旧Fragment还没完成淡出就被裁剪了。下面是具体的解决步骤:
1. 修正布局参数,避免容器高度被强制约束
首先调整你的Activity布局,把MainFrame的高度从match_parent改成wrap_content,同时给theMap设置权重让它占满剩余空间,这样MainFrame的高度会由Fragment内容决定,不会被提前裁剪:
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="myapplication.ScrollingActivity" tools:showIn="@layout/activity_scrolling"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <FrameLayout android:id="@+id/theMap" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </FrameLayout> <FrameLayout android:id="@+id/MainFrame" android:layout_width="match_parent" android:layout_height="wrap_content"> </FrameLayout> </LinearLayout> </android.support.v4.widget.NestedScrollView>
2. 优化Fragment事务,确保过渡顺序正确
在你的performTransition()方法里添加setReorderingAllowed(true),这个方法会告诉FragmentManager重新排序事务的执行步骤,确保旧Fragment的退出动画完全完成后,再调整容器布局并执行新Fragment的进入动画:
private void performTransition() { if (isDestroyed()) { return; } Fragment previousFragment = getSupportFragmentManager().findFragmentById(R.id.MainFrame); Fragment nextFragment = BlankFragment2.newInstance(); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); // 关键:允许事务重排序,保证过渡动画的执行顺序 fragmentTransaction.setReorderingAllowed(true); long FADE_DEFAULT_TIME = 2000; Fade exitFade = new Fade(); exitFade.setDuration(FADE_DEFAULT_TIME); previousFragment.setExitTransition(exitFade); Fade enterFade = new Fade(); enterFade.setStartDelay(FADE_DEFAULT_TIME); enterFade.setDuration(FADE_DEFAULT_TIME); nextFragment.setEnterTransition(enterFade); fragmentTransaction.replace(R.id.MainFrame, nextFragment); fragmentTransaction.commitAllowingStateLoss(); }
3. 可选:添加布局变化动画(提升流畅度)
如果希望容器高度变化时也有平滑过渡,可以给LinearLayout添加android:animateLayoutChanges="true",这样布局尺寸的变化会和Fragment的淡入淡出动画配合得更自然:
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:animateLayoutChanges="true">
为什么这些修改有效?
wrap_content让容器高度由Fragment内容动态决定,避免了LinearLayout提前强制调整容器尺寸,旧Fragment就能以完整高度完成淡出动画。setReorderingAllowed(true)解决了过渡动画和布局调整的顺序冲突,确保动画执行优先于布局变化。- 布局变化动画则让整体过渡更连贯,不会出现突兀的高度跳转。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

