安卓x。 FragmentTransaction 动画在 backpress 上不起作用
Posted
技术标签:
【中文标题】安卓x。 FragmentTransaction 动画在 backpress 上不起作用【英文标题】:androidx. FragmentTransaction animation does not work on backpress 【发布时间】:2020-01-03 13:12:30 【问题描述】:我想在后按时播放隐藏动画。 我有以下软件包的工作版本代码:
android.support.v4.app.Fragment;
android.support.v4.app.FragmentTransaction;
代码如下:
ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_right);
Fragment fragment = new RegisterFragment();
ft.replace(R.id.sign_in_fragment, fragment);
ft.commit();
但现在我正在使用 androidx 包
androidx.fragment.app.FragmentTransaction;
在这种情况下,后按动画不起作用。它只是不断地删除片段。 井代码略有不同但相同:
ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_top, R.anim.slide_out_top, R.anim.slide_out_top, R.anim.slide_out_top);
ft.replace(R.id.menu_fragment, menuFragment);
ft.addToBackStack(null);
ft.commit();
R.id.menu_fragment 是空的,我做了 replace 但 add 有相同的结果。 我找到了一个建议在片段上添加标签的答案,但它不起作用。
我认为这是 androidx 包问题,我不知道要更改什么。 并且项目不允许我使用同样旧的这个包:android.support.v4.app.FragmentTransaction;
该怎么办或我在哪里犯了错误? 提前致谢。
【问题讨论】:
【参考方案1】:您可以在 MainActivity 的 onBackPressed
方法中实现动画。
override fun onBackPressed()
val fragment = supportFragmentManager.fragments.last()
supportFragmentManager.beginTransaction().setCustomAnimations(R.anim.slide_up,R.anim.slide_down).remove(fragment).commit()
【讨论】:
这段代码不起作用,但它非常有帮助,因为它让我意识到问题出在 remove 函数 上,这导致我质疑“如何动画片段删除”@ 987654321@帮了我,谢谢。 我很高兴能帮上忙 ^^【参考方案2】:检查此代码..
My_Fragment fragment = new My_Fragment()
supportFragmentManager.beginTransaction()
.setCustomAnimations(R.anim.slide_in_right,
android.R.anim.fade_out)
.replace(R.id.container, home_Fragment_admin).commit()
【讨论】:
此代码几乎与 OP 发布的代码完全相同,除了 addToBackStack... 我确定它确实/确实如此,但这并不能改变它与 OP 的代码相同但对他/她不起作用的事实。 好代码。但问题是,当您替换或添加空 FragmentView 时,这不起作用。 OnBackpress 函数调用的 remove 函数,当没有什么可以替换回来,并且 remove 有动画问题,在这个 [question] (***.com/questions/13982240/…) 中说过【参考方案3】:问题似乎是 onBackPressed 函数正在使用的 remove 函数。 因为我添加片段时我的R.id.menu_fragment是空的,所以onBackPressed函数使用remove方法而不是replace或其他。 这让我想到了这个question。 我找到了解决办法(问题的答案中建议了这一点),但它很难看。 基本上,我所做的是创建其他片段并覆盖 onBackPressed,因此我将其替换为完全被替换动画隐藏的其他片段,而不是 remove 函数。
List<Fragment> fragments = getSupportFragmentManager().getFragments();
Fragment fragment = fragments.get(fragments.size() - 1);
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_out_top, R.anim.slide_out_top).replace(R.id.menu_fragment, exitMenuFragment).commit();
当再次进入片段时,我匹配了进入和退出的动画;
ft.setCustomAnimations(R.anim.slide_in_top, R.anim.slide_in_top);
执行很差,但只有我发现。
【讨论】:
以上是关于安卓x。 FragmentTransaction 动画在 backpress 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章
共享元素过渡适用于 FragmentTransaction.replace() 但不适用于 FragmentTransaction.add()
操作栏在 FragmentTransaction replace() 和 FragmentTransaction add() 上的行为方式
Android FragmentTransaction.addToBackStack 混淆
FragmentTransaction.remove 没有效果