16

के साथ समर्थन v4 अप टू डेट का उपयोग कर एंड्रॉइड गतिविधि संक्रमण, मैं अपने ऐप के लिए सामग्री डिज़ाइन लागू कर रहा था। मैंने देखा है कि यह सिर्फ यहाँ गतिविधियों के बीच संक्रमण बनाने के लिए संभव है:एंड्रॉइड एल

ActivityMain.java

Intent intent = new Intent(); 
String transitionName = getString(R.string.transition_album_cover); 
… 
ActivityOptionsCompat options = 
ActivityOptionsCompat.makeSceneTransitionAnimation(activity, 
    albumCoverImageView, // The view which starts the transition 
    transitionName // The transitionName of the view we’re transitioning to 
    ); 
ActivityCompat.startActivity(activity, intent, options.toBundle()); 

activity_main: http://android-developers.blogspot.com.es/2014/10/implementing-material-design-in-your.html

तो क्या "प्रामाणिक गति" खंड कहते हैं का पालन करने की कोशिश की .xml

<ImageView 
    … 
    android:transitionName="@string/transition_album_cover" /> 

activity_details.xml

<ImageView 
    … 
    android:transitionName="@string/transition_album_cover" /> 

बहरहाल, यह डिफ़ॉल्ट एंड्रॉयड गतिविधि संक्रमण बनाने के लिए लगता है, और मैं कोई एनिमेशन देखने।

मन है कि मैं requestWindowFeature (Window.FEATURE_CONTENT_TRANSITIONS) इसे यहाँ का कहना है के रूप में बुलाया रखें http://developer.android.com/reference/android/support/v4/app/ActivityOptionsCompat.html#makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String)

इसके अलावा सभी यह एक Nexus4 एपीआई स्तर 19

साथ परीक्षण किया गया था

समस्या कहां है?

उत्तर

30

ActivityOptionsCompat.makeSceneTransitionAnimation काम करता है> = 21 docs से:

सामग्री विषय और कस्टम गतिविधि संक्रमण जैसे कुछ सामग्री डिजाइन विशेषताएं हैं केवल Android 5.0 पर उपलब्ध (एपीआई स्तर 21) और ऊपर। हालांकि, आप इन ऐप्स को सुविधाओं का उपयोग करने के लिए डिज़ाइन कर सकते हैं जब सामग्री डिज़ाइन का समर्थन करने वाले डिवाइस पर चल रहे हों और अभी भी एंड्रॉइड की पिछली रिलीज चलाने वाले डिवाइसों के साथ संगत हो।

public static ActivityOptionsCompat makeSceneTransitionAnimation(Activity activity, 
     View sharedElement, String sharedElementName) { 
    if (Build.VERSION.SDK_INT >= 21) { 
     return new ActivityOptionsCompat.ActivityOptionsImpl21(
       ActivityOptionsCompat21.makeSceneTransitionAnimation(activity, 
         sharedElement, sharedElementName)); 
    } 
    return new ActivityOptionsCompat(); 
} 

तो क्यों कि विधि सहायता पैकेज में मौजूद है:

यहाँ यह की परिभाषा क्या है?

पुराने संस्करणों (एपीआई स्तर < = 20) के साथ पिछड़े संगतता को बनाए रखने के लिए ऐसा किया जाता है। maintaining compatibility docs से:

// Check if we're running on Android 5.0 or higher 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    // Call some material design APIs here 
} else { 
    // Implement this feature without material design 
} 
+0

से भरे हुए थे तो क्यों न सिर्फ चेक जोड़ें और आवश्यक चर बनाओ? काफी बेकार लगता है, नहीं? –

+1

जब तक AppCompat के लिए एपीआई वही रहता है तब यह एक कम कथन है कि हमें भविष्य में रिलीज़ के लिए लगातार बनाए रखने की आवश्यकता है। इसके अलावा यह इस के लिए बहुत कुछ नहीं लग सकता है, लेकिन आप अपने पूरे कोड पर इस तरह के कई मामलों को बनाए रखना नहीं चाहते हैं। – yiati

+0

ऐसा लगता है कि यह पीछे की ओर काम करता है, मैं इसके बारे में दस्तावेज़ नहीं देख सकता – Caipivara

7

गतिविधि संक्रमण Android 5.0 के लिए विशिष्ट हैं। ActivityOptionsCompat. makeSceneTransitionAnimation यदि आप 1 9 या उससे कम चल रहे हैं तो कुछ भी नहीं करता है। केवल API स्तर पर

+0

तो समर्थन विधि में यह विधि क्यों मौजूद है? इसका कोई मतलब नहीं है ... इस विधि दस्तावेज़ों को भी देखें। यह एपीआई स्तरों के बारे में कुछ भी नहीं कहता है https://developer.android.com/reference/android/support/v4/app/ActivityOptionsCompat.html#makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang। स्ट्रिंग) – BamsBamx

+9

यह एपीआई स्तर के आधार पर गतिविधियों को शुरू करने के लिए अलग-अलग कोड का उपयोग करने के दायित्व को रोकने के लिए हो सकता है। –

+0

@StephaneMathis सही है। यह 'ViewCompat' के समान प्रिंसिपल है (उदा।' ViewCompat।setElevation' एपीआई 1 9 और नीचे कुछ भी नहीं करता है)। – klmprt

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