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