2015-09-16 18 views
8

Dla makeSceneTransitionAnimation istnieją dwie statyczne funkcjewspółdziałanie varargs Kotlin Java nie działa prawidłowo

public static ActivityOptionsCompat makeSceneTransitionAnimation(Activity activity, 
     View sharedElement, String sharedElementName) 

i

public static ActivityOptionsCompat makeSceneTransitionAnimation(Activity activity, 
     Pair<View, String>... sharedElements) 

Pierwsze wywołanie funkcji działa prawidłowo w Kotlin, ale podczas wywoływania drugi, oba te wywołuje błędy zwrotne:

 val imageTransition = Pair<View, String>(imageView, imageView.getTransitionName()); 
     val textTransition = Pair<View, String>(textView, textView.getTransitionName()); 
     val transitionList = Array(2, { imageTransition }); 
     transitionList[1] = textTransition; 
     val options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, *transitionList); 

i

 val imageTransition = Pair<View, String>(imageView, imageView.getTransitionName()); 
     val textTransition = Pair<View, String>(textView, textView.getTransitionName()); 
     val options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, imageTransition, textTransition); 

Czy istnieje odpowiedni sposób, aby to zadziałało, czy jest to problem z interopem?

Edit zmiana dodane w celu zapewnienia, że ​​jest on przy użyciu tych samych klas

val imageView : View = view.findViewById(android.R.id.icon); 
val textView : View = view.findViewById(android.R.id.text1); 
imageView.setTransitionName("imageTransition"); 
textView.setTransitionName("textTransition") 

val imageTransition : android.support.v4.util.Pair<android.view.View, java.lang.String> = android.support.v4.util.Pair.create(imageView, imageView.getTransitionName() as java.lang.String); 
val textTransition : android.support.v4.util.Pair<android.view.View, java.lang.String> = android.support.v4.util.Pair.create(textView, textView.getTransitionName() as java.lang.String); 
val transitionList = Array(2, { imageTransition }); 
transitionList[1] = textTransition; 
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, *transitionList); 

Aktualny błąd kompilatora:

Error:(72, 84) The spread operator (*foo) may only be applied in a vararg position 
Error:(72, 99) No value passed for parameter sharedElementName 

I jeszcze

val imageView : View = view.findViewById(android.R.id.icon); 
val textView : View = view.findViewById(android.R.id.text1); 
imageView.setTransitionName("imageTransition"); 
textView.setTransitionName("textTransition") 

val imageTransition : android.support.v4.util.Pair<android.view.View, java.lang.String> = android.support.v4.util.Pair.create(imageView, imageView.getTransitionName() as java.lang.String); 
val textTransition : android.support.v4.util.Pair<android.view.View, java.lang.String> = android.support.v4.util.Pair.create(textView, textView.getTransitionName() as java.lang.String); 
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, imageTransition, textTransition); 

Aktualny błąd kompilatora:

Error:(72, 84) Type mismatch: inferred type is android.support.v4.util.Pair<android.view.View, java.lang.String> but android.view.View! was expected 
Error:(72, 101) Type mismatch: inferred type is android.support.v4.util.Pair<android.view.View, java.lang.String> but kotlin.String! was expected 
+0

Jakie są błędy, które kompilator zgłasza na tych przykładach? –

+0

Błąd: (70, 84) Operator rozrzutu (* foo) może być zastosowany tylko w pozycji vararg i Błąd: (70, 84) Niezgodność typu: wywnioskowany typ to kotlin.Pair but android.view.View! oczekiwano Błąd: (70, 101) Niedopasowanie typu: wywnioskowany typ to kotlin.Pair but kotlin.String! oczekiwano –

Odpowiedz

10

Odpowiedź jest * symbol przed zmiennej tablicowej:

import android.support.v4.util.Pair as AndroidPair 

// ...  

val pair1 = AndroidPair<View, String>(fab, 
    getString(R.string.transition_fab)) 
val pair2 = AndroidPair<View, String>(findViewById(R.id.app_bar), 
    getString(R.string.transition_appbar)) 

ActivityOptionsCompat.makeSceneTransitionAnimation([email protected], 
    *arrayOf(pair1, pair2)).toBundle(); 
2

Może być tak, że jesteś przypadkowo używając kotlin.Pair zamiast android.util.Pair. Należy dodać następującą dyrektywę import do początku pliku:

import android.util.Pair 
+0

Nie, nawet próbowałem robić 'android.util.Pair.create (imageView, imageView.getTransitionName());' –

+0

Czy komunikat o błędzie kompilacji zmienia się po wykonaniu? –

+0

Ten sam komunikat o błędzie –

2

Ten pracował dla mnie:

import android.support.v4.util.Pair 

// ...  

val options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, 
     Pair<View, String>(image, image.transitionName), 
     Pair<View, String>(title, title.transitionName)) 

startActivity(intent, options.toBundle())