2015-09-16 16 views
8

Per la makeSceneTransitionAnimation ci sono due funzioni statichevarargs Kotlin Java interoperabilità non funziona correttamente

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

e

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

La prima chiamata di funzione funziona correttamente in Kotlin ma quando si chiama il secondo, entrambi questi chiama gli errori di restituzione

 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); 

e

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

C'è un modo corretto per farlo funzionare o si tratta di un problema con l'interoperabilità?

Modifica Aggiunto cambiamento per garantire che si sta usando le stesse classi

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); 

attuale errore di compilazione:

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

E un altro

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); 

errore del compilatore attuale:

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

Quali sono gli errori che il compilatore riporta su questi esempi? –

+0

Errore: (70, 84) L'operatore di spread (* foo) può essere applicato solo in una posizione vararg e Errore: (70, 84) Tipo non corrispondente: il tipo inferito è kotlin.Pair ma android.view.View! era previsto Errore: (70, 101) Tipo non corrispondente: il tipo inferito è kotlin.Pair ma kotlin.String! era previsto –

risposta

10

La risposta è il simbolo * prima variabile di matrice:

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

Può essere il caso che si sta utilizzando per errore al posto di kotlin.Pairandroid.util.Pair. Si prega di aggiungere la seguente direttiva di importazione all'inizio del file:

import android.util.Pair 
+0

No, anche provato a fare 'android.util.Pair.create (imageView, imageView.getTransitionName());' –

+0

Il messaggio di errore della compilazione cambia dopo averlo fatto? –

+0

Stesso messaggio di errore –

2

Questo ha funzionato per me:

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())