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

共享元素转换与FragmentTransaction一起工作。replace()但不适用于FragmentTransaction。添加()

微生城
2023-03-14

当我使用片段“replace”时,新的共享元素转换可以工作,但我似乎无法使它在片段“add”中工作。我在这两种情况下使用相同的容器。

更多详情:

活动-布局-

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00ffff"
    android:orientation="vertical" >

</FrameLayout>

在活动启动时,我将Fragment1添加到屏幕上

getFragmentManager().beginTransaction().replace(R.id.container,new TransitionTestFragment1(), "TransitionTestFragment1").commit();

在Fragment1布局中视图的单击事件上-

public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
final TransitionSet transitionSet = new TransitionSet();
transitionSet.addTransition(new ChangeImageTransform());
transitionSet.addTransition(new ChangeBounds());
transitionSet.addTransition(new ChangeTransform());
transitionSet.setDuration(300);

View v=inflater.inflate(R.layout.fragment1, null);
final View image=v.findViewById(R.id.image);
image.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        setSharedElementReturnTransition(transitionSet);
        Fragment fragment = new TransitionTestFragment2();
        fragment.setSharedElementEnterTransition(transitionSet);

        FragmentTransaction ft = getFragmentManager().beginTransaction()
                .replace(R.id.container, fragment)
                .addToBackStack("transaction")
                .addSharedElement(image, "MyTransition");
        ft.commit();

    }
});
return v;

}

我在两个片段的布局中都有这个图像视图

 <ImageView
        android:layout_width="300dp" 
        android:layout_height="300dp"
        android:src="@drawable/ic_launcher"
        android:transitionName="MyTransition" />

现在,如果我使用FragmentTransaction,转换将不起作用。add()添加第二个片段,但是如果我使用FragmentTransaction,它会起作用。替换()。如何使其与add()一起工作?有可能吗?

共有3个答案

温星华
2023-03-14

它不会动画,因为旧的片段仍然存在。对于添加,您需要隐藏前一个片段。这里有个例子

推送:

    fragmentTransaction.add(R.id.content, fragment);
    if (fragments.size() > 0) {
        UIBaseFragment lastElement = fragments.lastElement();
        fragmentTransaction.hide(lastElement);
    }
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
    fragments.push(fragment);

那就这样跳吧

    final FragmentManager manager = getChildFragmentManager();
    manager.popBackStack();
    fragments.pop();
富波光
2023-03-14

我猜是因为新碎片放在旧碎片的上面。旧的片段没有被放置在控制器之外,并且没有调用onPence(和顺序方法)。它不播放任何转换,因为旧的片段可能仍然对用户可见(系统不知道)。

在我的回答中(在你评论的地方),我添加了一个进入和退出转换。如果你添加了它,它会有动画吗?如果不是的话,可能是因为所述的原因。

慕冠宇
2023-03-14

我知道这是一个老问题,但最近我遇到了同样的问题:。替换不是一个选项。

我不得不使用。躲藏起来。添加,对我有效的是设置:

setReorderingAllowed(true) 

关于交易。

 类似资料:
  • 我实现的片段如下: 保存父片段的活动。使用getSupportFragmentManager()添加父片段。 在父片段中,我使用getChildFragmentManager()和事务来替换子片段。 我再一次调用儿童片段,以此类推...... 除了共享过渡,一切都很好。 如果我使用getFragmentManager()而不是getChildFragmentManager(),则存在共享转换,但没

  • 我希望采用Glide库来代替通用图像加载器,但在共享元素转换方面遇到了问题。 在我的简单沙盒中,我使用UIL创建了以下过渡:https://dl.dropboxusercontent.com/u/97787025/device-2015-06-18-113333.mp4 非常简单,而且效果很好。但当我使用Glide时,它看起来不太好看:https://dl.dropboxusercontent.c

  • 如果您运行应用程序,并单击奶酪列表项,您将看到过渡动画如何将图像移动到目标活动视图中不正确(太高)的偏移量。一旦动画完成,图像将出现“扭曲”到正确的位置。 任何关于可能工作的想法都是非常欢迎的。

  • 我一直在尝试实现这个共享元素转换,并在单击转换时不断出现“java.lang.IllegalArgumentException:共享元素不能为null”错误。请帮忙。 这是下面给出的MainActive onCreate方法。请检查我的代码。 这是recyclerView的onClickListener。 图像的过渡名称相同。这里的bug修复在使用共享元素的活动转换中出现问题并不是问题所在。 我卡

  • 问题内容: 我想在单词中镜像字母,所以我使用了CSS变换属性,但是如果我将文本包裹在一个范围内则无法使用,但是如果我选择了ass或 那么转换不适用于内联元素吗? 示例1(转换失败) 示例2(Works,如果使用OR) 问题答案: 在官方W3规范中,在可转换元素下回答: 一个元素,其布局由CSS框模型控制,该CSS框模型可以是 块级 或 原子内联级元素 ,或者其“ display”属性可以计算为“

  • 我正在尝试使用FragmentTransaction实现以下效果。设置自定义动画。 片段A正在显示 将片段A替换为片段B。在替换过程中,片段A应该保持可见。片段B应该从右侧滑入。片段B应该在片段A的顶部滑动。 我在动画设置中获得幻灯片没有问题。我的问题是,当幻灯片在动画中运行时,我不知道如何使片段A停留在它所在的位置,并处于片段B之下。不管我怎么做,碎片A似乎在上面。 我怎样才能做到这一点? 这是