17

नई साझा तत्व संक्रमण काम करता है के साथ काम नहीं करता है जब मैं का उपयोग टुकड़ा 'की जगह' लेकिन मैं यह टुकड़ा काम करने के लिए नहीं कर पा रहे '' जोड़ें। मैं दोनों मामलों में एक ही कंटेनर का उपयोग करता हूं।साझा तत्व संक्रमण 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> 

गतिविधि के शुभारंभ पर, मैं Fragment1 स्क्रीन

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

करने के लिए एक के लिए जोड़ने के एक क्लिक करें घटना पर 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

मैं भी इस समस्या का सामना करना पड़ रहा में पॉप ... आप एक समाधान मिला? –

उत्तर

2

मुझे लगता है कि ऐसा इसलिए है क्योंकि नया टुकड़ा पुराने टुकड़े के शीर्ष पर रखा गया है। पुराना टुकड़ा नियंत्रक से बाहर नहीं रखा जा रहा है और (और अनुक्रमित विधियों) को नहीं कहा जा रहा है। यह किसी भी संक्रमण को नहीं चलाता है क्योंकि पुराना टुकड़ा अभी भी उपयोगकर्ता को दिखाई दे सकता है (सिस्टम उसे नहीं जानता है)।

मेरे answer (जहां आपने टिप्पणी की) में मैंने एक प्रविष्टि और निकास संक्रमण जोड़ा। यदि आप इसे जोड़ते हैं, तो क्या यह भी एनिमेट करता है? यदि नहीं, तो शायद यह कारण बताए गए कारणों से है।

+0

नहीं, जब मैं आपके उत्तर के अनुसार इसे 'जोड़'ता हूं तो यह एनिमेट नहीं होता है। मैंने कल्पना की कि कारण होगा। क्या आपके पास काम के आसपास के बारे में कोई विचार है? किसी भी तरह से मैं 'प्रतिस्थापन' को बदलने के लिए 'add' को बदलने के बिना इस काम को कर सकता हूं? वैसे भी जवाब के लिए धन्यवाद। –

+0

मुझे नहीं पता था। मैं कहूंगा कि यह संभव नहीं है क्योंकि सिस्टम एक दृश्य को 'resuing' पर आधारित है। मुझे लगता है कि आप अपने पुराने टुकड़े में सभी विचारों को छोड़ना चाहते हैं, और नए खंड में एक ही दृश्य को 'पुन: उपयोग' करना चाहते हैं। कोई फर्क नहीं पड़ता कि आपका नया टुकड़ा कितना जटिल है, अन्यथा मैं इसे 'पुराने' खंड के लेआउट में सब कुछ डाल दूंगा, इसे स्वयं एनिमेट कर दूंगा। लेकिन कभी-कभी रियायतें (तकनीकी बनाम डिज़ाइन) बनाना बेहतर होता है और या तो दृश्य को एनिमेट नहीं किया जाता है, या फैंसी एनीमेशन और कोई 'दृश्यमान स्टैक' नहीं होता है। यदि पुराना टुकड़ा दिखाई नहीं देता है, तो क्यों उपयोग करें और प्रतिस्थापित नहीं करें? – ar34z

+1

सोचें कि यह भी संभव नहीं है। एक निश्चित उत्तर खोज रहे हैं ताकि मैं आगे बढ़ सकूं।कारण मैं प्रतिस्थापन का उपयोग नहीं करना चाहता क्योंकि यह पुराना टुकड़ा भारी काम करता है (प्रदर्शित होने के लिए डेटा की काफी बड़ी मात्रा डाउनलोड करता है, इसमें कई क्षैतिज स्क्रॉल दृश्य होते हैं) जब इसे प्रारंभ किया जाता है .. जिसके कारण SaveInstanceState/onRestore .. पर्याप्त चिकनी नहीं है .. जबकि अगर मैं सिर्फ जोड़ का उपयोग करता हूं, तो सब कुछ सुचारू रूप से काम करता है (क्योंकि मुख्य स्मृति से कुछ भी अनलोड नहीं किया जाता है) –

-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

संबंधित मुद्दे