安卓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 是空的,我做了 replaceadd 有相同的结果。 我找到了一个建议在片段上添加标签的答案,但它不起作用。

我认为这是 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 没有效果

FragmentActivity 与使用 FragmentTransaction 管理 Fragment?

FragmentManager 和 FragmentTransaction 到底是做啥的?