2015-06-03 15 views
45

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

https://dl.dropboxusercontent.com/u/97787025/device-2015-06-03-114842.mp4

यह सिर्फ एक Fragment-> टुकड़ा संक्रमण का उपयोग किया जाता है:

यहाँ यह कैसा दिखना चाहिए का एक बहुत ही सरल वीडियो है।

समस्या तब उत्पन्न होती है जब आप ViewPager के अंदर प्रारंभिक खंड डालते हैं। मुझे संदेह है क्योंकि यह व्यूपार्जर अपने मूल खंड के बच्चे के टुकड़े प्रबंधक का उपयोग करता है, जो गतिविधि के खंड प्रबंधक से अलग है, जो खंड लेनदेन को संभालने वाला है।

https://dl.dropboxusercontent.com/u/97787025/device-2015-06-03-120029.mp4

मैं यहां मुद्दा यह है बहुत कुछ कर रहा हूँ के रूप में मैं ऊपर बताया गया बच्चा टुकड़ा प्रबंधक बनाम गतिविधि का टुकड़ा प्रबंधक है: यह इस प्रकार होता का एक वीडियो है।

SimpleFragment fragment = new SimpleFragment(); 

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
transaction.replace(R.id.am_list_pane, fragment, fragment.getClass().getSimpleName()); 

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    TransitionSet enterTransition = new TransitionSet(); 
    enterTransition.addTransition(new ChangeBounds()); 
    enterTransition.addTransition(new ChangeClipBounds()); 
    enterTransition.addTransition(new ChangeImageTransform()); 
    enterTransition.addTransition(new ChangeTransform()); 

    TransitionSet returnTransition = new TransitionSet(); 
    returnTransition.addTransition(new ChangeBounds()); 
    returnTransition.addTransition(new ChangeClipBounds()); 
    returnTransition.addTransition(new ChangeImageTransform()); 
    returnTransition.addTransition(new ChangeTransform()); 

    fragment.setSharedElementEnterTransition(enterTransition); 
    fragment.setSharedElementReturnTransition(returnTransition); 

    transaction.addSharedElement(iv, iv.getTransitionName()); 
} 

transaction.addToBackStack(fragment.getClass().getName()); 

transaction.commit(); 

यह ठीक काम करता है जब दोनों टुकड़े गतिविधि का टुकड़ा प्रबंधक द्वारा प्रबंधित कर रहे हैं, लेकिन जब मैं इस तरह की एक ViewPager लोड:

ViewPager pager = (ViewPager) view.findViewById(R.id.pager); 
pager.setAdapter(new Adapter(getChildFragmentManager())); 

के बच्चों यहाँ कैसे मैं संक्रमण बनाने रहा है ViewPager गतिविधि द्वारा प्रबंधित नहीं किया जा रहा है, और यह अब और काम नहीं करता है।

क्या यह एंड्रॉइड टीम द्वारा एक निरीक्षण है? क्या इसे खींचने का कोई तरीका है? धन्यवाद।

+1

क्या आप कृपया अपनी गतिविधि, अभिभावक टुकड़ा और बाल टुकड़ा का पूरा कोड प्रदान कर सकते हैं? धन्यवाद :) –

+0

मुझे नेस्टेड 'फ्रैगमेंट और साझा तत्व संक्रमणों के साथ भी समस्याएं थीं, [यहां] (http://stackoverflow.com/questions/29029970/fragment-shared-element-transition-not-working-in-nested -दृश्य) मेरा सवाल है। –

+0

आप एडवेंटर को चाइल्डफ्रैगमेंट मैनेजर क्यों पास करते हैं, न कि FragmentManger? – EE66

उत्तर

31

शायद आपको पहले से ही एक उत्तर मिल गया है इसके लिए, लेकिन यदि आपके पास नहीं है, तो मैंने अपने सिर को खरोंचने के कुछ घंटों के बाद इसे ठीक करने के लिए किया है।

समस्या मुझे लगता है कि

दो कारकों का एक संयोजन है:

  • देरी से FragmnetsViewPager में लोड, जिसका अर्थ है कि गतिविधि बहुत तेजी से अपने टुकड़े जो ViewPager

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

इन समस्याओं के दोनों ठीक करने के लिए, यह मैं क्या किया है:

1. देरी लोड हो रहा है समस्या फिक्सिंग:

अपनी गतिविधि के अंदर

(एक है कि ViewPager शामिल हैं), super.onCreate() के बाद और setContentView() से पहले इस पंक्ति जोड़ें:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ActivityCompat.postponeEnterTransition(this); // This is the line you need to add 

    setContentView(R.layout.feeds_content_list_activity); 
    ... 
} 

2. एक ही संक्रमण नाम के साथ कई टुकड़ों के साथ समस्या को ठीक करना:

अब ऐसा करने के कुछ तरीके हैं लेकिन यह मेरी "विस्तार" गतिविधि, यानी गतिविधि के साथ समाप्त हुआ कि ViewPager (onCreate() में लेकिन आप इसे कहीं भी वास्तव में क्या कर सकते हैं) शामिल हैं:

_viewPager.setAdapter(_sectionsPagerAdapter); 
_viewPager.setCurrentItem(position); 
... 
... 
_pagerAdapter.getItem(position).setTransitionName(getResources().getString(R.string.transition_contenet_topic)); 

आप तो यह आसान है बस संक्रमण में पारित करने के लिए सावधान रहना चाहिए क्योंकि Activity अभी तक अपने ViewPager टुकड़ा से जुड़ी नहीं किया जा सकता यदि आप इसे संसाधन

से लोड कर रहे हैं तो गतिविधि से खंड में नाम

वास्तविक क्रियान्वयन के रूप में सरल है के रूप में आप उम्मीद:

public void setTransitionName(String transitionName) { 
    _transitionName = transitionName; 
} 
फिर अंदर

अपने टुकड़ा के onViewCreated(), इस पंक्ति जोड़ें:

public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    ... 
    if (_transitionName != null && android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { 
     setTransitionNameLollipop(); 
    } 
    ... 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
private void setTransitionNamesLollipop() { 
    _imgTopic.setTransitionName(_transitionName); 
} 

पहेली के अंतिम टुकड़ा जब अपने टुकड़ा पता लगाने के लिए है पूरी तरह से लोड किया गया है और फिर ActivityCompat.startPostponedEnterTransition(getActivity()); पर कॉल करें।

मेरे मामले में, मेरे टुकड़े बाद में पूरी तरह से लोड नहीं हुए थे क्योंकि मैं यूआई थ्रेड से अधिकतर चीज़ों को लोड कर रहा हूं जिसका मतलब है कि मुझे यह सब कुछ लोड होने पर कॉल करने का तरीका पता था, लेकिन यदि यह आपका मामला नहीं है, setTransitionNameLollipop() पर कॉल करने के बाद आप यह अधिकार कॉल कर सकते हैं।

इस दृष्टिकोण के साथ समस्या यह है कि जब तक आप बहुत सावधान नहीं होते हैं और exit से पहले नेविगेट करने की गतिविधि से पहले "दृश्यमान" खंड पर संक्रमण नाम को रीसेट कर सकते हैं, तब तक बाहर निकलने का संक्रमण तब तक काम नहीं कर सकता है। यही कारण है कि आसानी से ऐसा तरह किया जा सकता है:

  1. पर बदलें पृष्ठ पर सुनो अपने ViewPager
  2. संक्रमण नाम (रों) निकालें जैसे ही आपका टुकड़ा दृश्य से बाहर है
  3. सेट संक्रमण नाम (रों) दृश्य खंड पर।
  4. इसके बजाय finish() बुलाने की, ActivityCompat.finishAfterTransition(activity);

इस फोन तुम वापस संक्रमण एक RecyclerView जो मेरे मामले था में संक्रमण के लिए की जरूरत है बहुत जटिल प्राप्त कर सकते हैं बहुत जल्द ही।ViewPager Fragments – Shared Element Transitions जो एक बहुत ही अच्छी तरह से लिखा उदाहरण कोड (एक बहुत मैं सिर्फ क्या लिखा तुलना में अधिक जटिल यद्यपि) है यहाँ: कि के लिए, वहाँ @Alex लॉकवुड यहाँ द्वारा प्रदान की एक बेहतर जवाब https://github.com/alexjlockwood/activity-transitions/tree/master/app/src/main/java/com/alexjlockwood/activity/transitions

मेरे मामले में, मैं नहीं था ' टी को अपने समाधान को लागू करने के लिए अब तक जाना है और उपरोक्त समाधान जो मैंने पोस्ट किया है, मेरे मामले के लिए काम किया है।

यदि आपके पास एकाधिक साझा तत्व हैं, तो मुझे यकीन है कि आप उन्हें पूरा करने के तरीकों का विस्तार कैसे कर सकते हैं।

+0

हैलो यह मेरे लिए काम नहीं कर रहा है .. मैं जो कोशिश कर रहा हूं वह यह है कि मेरे पास व्यूअर के टुकड़े में एक सूची है और किसी भी आइटम के क्लिक पर मैं छवि को विस्तार से विभाजित करना चाहता हूं .. मैंने यहां हर संभावित समाधान की कोशिश की ..पर कुछ भी काम नहीं कर रहा है..बहुत मदद की सराहना की जाएगी। पहले से ही धन्यवाद। –

+0

खंड खंडों के साथ इसे कैसे प्राप्त किया जा सकता है यहां पाया जा सकता है: http://stackoverflow.com/a/26984314/2380518 –

+0

इस उत्तर के लिए धन्यवाद - मुझे सही दिशा में इंगित किया! – ligi

1

गतिविधि supportPostponeEnterTransition();

और जब आपके टुकड़े लोड किए गए हैं (उन्हें सिंक करने के लिए, हो सकता है EventBus के साथ प्रयास करें या जो कुछ भी)

startPostponedEnterTransition();

इस नमूने

http://www.androiddesignpatterns.com/2015/03/activity-postponed-shared-element-transitions-part3b.html

का संदर्भ लें पर
0

मैं हाल ही में दीवार के खिलाफ अपने सिर को टक्कर लगी हूं। मैं चाहता था कि एक व्यूपेजर में एक अच्छा फ्रेगमेंट लॉन्च करने के लिए एक अच्छा विस्तार कार्ड प्रकार साझा तत्व संक्रमण के साथ एक टुकड़ा था।

<style name="AppTheme.CustomDialog" parent="MyTheme"> 
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:backgroundDimEnabled">true</item> 
</style> 

फिर टुकड़ा की गतिविधि शुरू करने के लिए: सुझाव मेरे लिए काम किया उपरोक्त में से कोई तो मैं एक गतिविधि एक संवाद की तरह स्टाइल लांच करने का प्रयास करने का निर्णय लिया

Intent intent = new Intent(getContext(), MyDialogActivity.class); 
ActivityOptionsCompat options = ActivityOptionsCompat 
         .makeSceneTransitionAnimation(getActivity(), 
           Pair.create(sharedView, "target_transition")); 
ActivityCompat.startActivity(getActivity(), intent, options.toBundle()); 

टुकड़ा लेआउट में डाल एक एंड्रॉइड: साझा दृश्य पर transition_name और गतिविधि लेआउट में एंड्रॉइड है: transition_name = "target_transition" (pair.create() दूसरा तर्क के समान)।

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