当前位置: 首页 > 知识库问答 >
问题:

与getChildFragmentManager()的共享转换不工作,但与getFragmentManager()一起工作

时才俊
2023-03-14

我实现的片段如下:

  1. 保存父片段的活动。使用getSupportFragmentManager()添加父片段。
  2. 在父片段中,我使用getChildFragmentManager()和事务来替换子片段。
  3. 我再一次调用儿童片段,以此类推......
  4. 除了共享过渡,一切都很好。
  5. 如果我使用getFragmentManager()而不是getChildFragmentManager(),则存在共享转换,但没有getChildFragmentManager()的概念。

代码示例如下所示:

/*This code does not show animation*/
getChildFragmentManager()
                .beginTransaction()
                .addSharedElement(transitionView, ViewCompat.getTransitionName(transitionView))
                .replace(R.id.fragment_container, categoryDetailChildFragment)
                .addToBackStack(TAG)
                .commit();

显示动画的代码是:

  getFragmentManager()
                .beginTransaction()
                .addSharedElement(transitionView, ViewCompat.getTransitionName(transitionView))
                .replace(R.id.fragment_container, categoryDetailChildFragment)
                .addToBackStack(TAG)
                .commit();

为什么getChildFragmentManager()时没有共享转换?请帮助任何人。

共有2个答案

贺子昂
2023-03-14

从15:00到17:00观看此视频片段技巧(Google I/O’17)

我也有同样的问题。就这么做吧!

在onCreateView方法中:

postponeEnterTransition();
final ViewGroup group = inflater.inflate(R.layout.layout_to_inflate,container,false);

ViewTreeObserver.OnGlobalLayoutListener treeObserver = new ViewTreeObserver.OnGlobalLayoutListener(){

@Override
        public void onGlobalLayout() {
            startPostponedEnterTransition();
            group.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }    
}


group.getViewTreeObserver().addOnGlobalLayoutListener(treeObserver);

确保在调用addSharedElement()片段事务调用时调用setReorderingAllowed(true)!

尝试一下,动画应该会运行顺畅。我知道Android片段不容易处理!

鄢英哲
2023-03-14

每个片段都有自己的子片段管理器。因此,如果您在另一个片段中有多个嵌套片段,您应该引用同一个片段的子片段管理器,您在其中使用addSharedElement()。

因此,如果您有:

ActivityA
|_ FragmentB
   |_ FragmentC
      |_ FragmentD

您应该使用uppest公共片段的getChildFragmentManager()-在本例中,片段B用于片段C和片段D,以确保每个嵌套片段引用相同的fragmentManager。这就是为什么在使用activity的fragmentManager时它会起作用,因为只有一个activity,并且每个activity都使用getActivity()引用同一个activity

要在嵌套片段中获取父片段,您可以在嵌套片段的onAttach()方法上使用get家长片段()。您还可以将其强制转换为FragmentB等特定类:

override fun onAttach(context: Context) {
    super.onAttach(context)

    val fragment: FragmentB = parentFragment.parentFragment.parentFragment... as FragmentB
}
 类似资料:
  • 当我使用片段“replace”时,新的共享元素转换可以工作,但我似乎无法使它在片段“add”中工作。我在这两种情况下使用相同的容器。 更多详情: 活动-布局- 在活动启动时,我将Fragment1添加到屏幕上 在Fragment1布局中视图的单击事件上- } 我在两个片段的布局中都有这个图像视图 现在,如果我使用添加第二个片段,但是如果我使用。如何使其与add()一起工作?有可能吗?

  • 在我的Laravel应用程序中,我需要定期使用Guzzle将数据发送到API。 API使用承载令牌进行身份验证,并请求和接受原始JSON。为了进行测试,我使用Postman访问了API,一切都工作得很好。

  • 我想通过聊天Id获得用户和组之间的聊天次数。但查询没有给出聊天次数。它是空白的。我在堆栈溢出(Laravel Elount groupBy()和count,Laravel get count of results Basin groupBy)中也看到过类似的问题,并使用了那些标记为正确但仍然没有得到所需结果的查询。 我使用以下查询: 我的表格结构如下: 结果是这样的: )

  • 我想从Spring Boot应用程序创建一个war文件,我可以将其部署到独立的Tomcat容器中,而不是使用嵌入式容器。 我可以创建war文件,并使用单独运行它,它工作得很好。 我使用(使用Gradle、Tomcat7、Java1.7)构建了应用程序。 但当我将war文件部署到独立的Tomcat并启动它时,根据日志显示,应用程序似乎没有错误地启动,但我无法访问任何资源,控制器URL也无法工作。 当

  • 错误:org.apache.hive.service.cli.hivesqlexception:处理语句时出错:失败:执行错误,从org.apache.hive.service.cli.operation.operation.toSqlexception(operation.java:380)(org.apache.hive.service.cli.operation.sqloperation.r

  • 3)使用REST客户端 将response_resclient.code 对于1和2,两者都是正确的。它们都返回状态201,登录成功,但使用3-REST_Client失败。状态为404 REST_Client: 对于Rest-client gem,它在向mysite.vn发送post请求后返回404错误,代码为443。我对这个案子没有理想。请你帮我解释一下这个案子好吗。如何用REST客户端纠正这个