17

当我使用Fragment'替换'时,新的共享元素转换工作正常,但我似乎无法使其工作片段'add'。我在这两种情况下都使用相同的容器。共享元素转换与FragmentTransaction.replace()一起工作,但不支持FragmentTransaction.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> 

在推出的活动,我想补充片段1到屏幕

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

上的click事件的在Fragment1的布局中查看 - >我将Fragment2添加到屏幕上。我设置了听众的第一个片段的onCreateView

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.replace()来代替。我如何使它与add()一起工作?它有可能吗?

+0

然后弹出...你找到一个解决办法? – 2017-02-16 07:09:29

回答

2

我想这是因为新的片段放在旧片段的顶部。旧片段未被放置在控制器之外,并且(和已排序的方法)未被调用。它不会播放任何转换,因为旧片段可能仍然对用户可见(系统不知道)。

在我的answer(您评论过的地方)我添加了一个进入和退出转换。如果你添加它,它甚至是动画?如果没有,这可能是由于陈述的原因。

+0

不,它根据您的回答“添加”时不会生成动画。我想到这将是原因。你有什么想法可以解决吗?任何方式,我可以使这项工作,而不必诉诸改变'添加'到'取代'?无论如何感谢您的答案。 – 2015-03-24 12:50:02

+0

我不知道。我想说这是不可能的,因为系统是基于'重新提供'一个视图。我假设你想让旧片段中的所有视图保持原样,并在新片段中“重新使用”单个视图。不知道你的新片段有多复杂,否则我会把所有东西放在'旧'片段的布局中,自己动画。但是有时候最好做出让步(技术vs设计),要么不使动画看起来动画化,要么制作花哨的动画,也没有“可见的堆叠”。如果旧片段不能保持可见,为什么使用add而不是replace? – ar34z 2015-03-24 13:50:57

+1

认为它也不可能。寻找一个明确的答案,所以我可以继续前进。原因为什么我不想使用替换是因为旧的片段执行繁重的工作(下载相当大量的数据来显示,具有多个水平滚动视图),当它被初始化..由于onSaveInstanceState/onRestore ..不够流畅..但如果我只是使用添加,一切工作顺利(因为没有任何东西从主内存中卸载) – 2015-03-24 14:32:19

-1

它不会动画,因为旧片段仍然存在。添加你需要隐藏前面的片段。这里是例子

推:

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(); 
+0

请尝试解释您的代码,并且该代码不起作用。 – extmkv 2017-06-07 18:07:01