退出animation不起作用; FragmentTransaction自定义animation不适用于隐藏

我使用show / hide来显示占据屏幕一部分的片段。 出于某种原因,当显示片段时,会播放slide_in_leftanimation,但是当片段被隐藏时没有animation,片段就会消失。 我已经尝试使用slide_in_leftanimationexitenter ,这没有帮助。 当把代码追踪到支持包中时,animation就会被创build,并且显示它的代码正在被执行。 (我跟踪了.hide电话)

 FragmentManager fm = _activity.getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.my_fragment); FragmentTransaction ft = fm.beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left); if (fragment.isHidden()) { ft.show(fragment); fragment.setUserVisibleHint(true); } else { ft.hide(fragment); } ft.commit(); 

以防万一这里是slide_out_leftanimation的xml

 <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="-50%p" android:duration="@android:integer/config_mediumAnimTime"/> <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="@android:integer/config_mediumAnimTime" /> </set> 

编辑:这个问题可能与my_fragment与另一个包含webview的片段共享屏幕宽度有关。 当为my_fragment执行.show时,它变得可见并且在水平线性布局内共享空间(两个片段中每一个所占的屏幕宽度由weight参数确定)。

Solutions Collecting From Web of "退出animation不起作用; FragmentTransaction自定义animation不适用于隐藏"

就我个人而言,这是一个与片段animationzPosition的错误。

你看到的是新的片段“出现”,这是因为新的片段附加在当前的片段之下。

因此,当试图为现有片段的“顶部”animation片段时,看起来好像没有任何事情发生,然后新的片断就出现了。

我已经尝试了许多工作,玩zPosition(只影响窗口不布局,所以没有影响片段), onAnimationCreate()带来根布局前面,甚至在animation开始和停止…似乎什么都不做。

所以在这个时候,在没有为片段转换写一个完整的自定义animation的时候,他们目前有点bug。

你可能要玩。 .add(Fragment)等待它被添加,然后调用.remove(Fragment)去除旧的片段,这样新的片段被物理地放置在现有片段的顶部。

尝试使用setCustomAnimations(int enter,int exit,int popEnter,int popExit)而不是setCustomAnimations(int enter,int exit)当您将调用popupbackstack退出animation将不会被调用

我认为它出现了同样的情况:

我有N片段,我想有一个自定义animation,但我不想重新加载片段,所以做一个addremovereplace不是一个解决scheme,并与show / hide我无法同步animation之间两个片段。

要解决这个问题,我必须为每个片段使用一个FrameLayout。

这里的代码。

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:layout_above="@+id/main_bottom_navigation" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/library" android:layout_width="match_parent" android:layout_height="match_parent"/> <FrameLayout android:id="@+id/search" android:layout_width="match_parent" android:layout_height="match_parent"/> <FrameLayout android:id="@+id/discover" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout> <com.roughike.bottombar.BottomBar android:id="@+id/main_bottom_navigation" android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" app:bb_tabXmlResource="@xml/main_bb_tabs" app:bb_inActiveTabColor="@color/taupegray" app:bb_activeTabColor="@color/green_apple" app:bb_showShadow="true"/> </RelativeLayout> 

然后控制要显示的片段:

 private void showFragment(BaseFragment fragment) { Animation animation = AnimationUtils.loadAnimation(this, R.anim.slide_in_from_right); if (fragment instanceof DiscoverFragment) { mDiscoverContainer.bringToFront(); mDiscoverContainer.startAnimation(animation); return; } if (fragment instanceof LibraryFragment) { mLibraryContainer.bringToFront(); mLibraryContainer.startAnimation(animation); return; } if (fragment instanceof SearchFragment) { mSearchContainer.bringToFront(); mSearchContainer.startAnimation(AnimationUtils.loadAnimation(animation); return; } } 

关键是在bringToFront

我希望它是有用的!

我能够得到退出animation工作使用.replace而不是.add

 ft.replace(R.id.container, new MyFragment());