【问题标题】:Varargs Kotlin Java interop not working properlyVarargs Kotlin Java 互操作无法正常工作
【发布时间】:2015-12-12 14:05:56
【问题描述】:

makeSceneTransitionAnimation 有两个静态函数

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

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

第一个函数调用在 Kotlin 中正常工作,但调用第二个函数时,这两个调用都返回错误

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

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

是否有适当的方法可以使其正常工作,或者这是互操作的问题?

编辑 添加更改以确保它使用相同的类

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

当前编译器错误:

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

还有一个

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

当前编译器错误:

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

【问题讨论】:

  • 编译器在这些示例中报告的错误是什么?
  • 错误:(70, 84) 扩展运算符 (*foo) 只能应用于可变参数位置并且错误:(70, 84) 类型不匹配:推断类型为 kotlin.Pair 但 android.view.View!预期错误:(70、101)类型不匹配:推断类型是 kotlin.Pair 但 kotlin.String!预计

标签: android kotlin kotlin-android-extensions


【解决方案1】:

答案是数组变量前的*符号:

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(this@MyActivity,
    *arrayOf(pair1, pair2)).toBundle();

【讨论】:

    【解决方案2】:

    这对我有用:

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

    【讨论】:

      【解决方案3】:

      您可能不小心使用了kotlin.Pair 而不是android.util.Pair。请将以下导入指令添加到文件的开头:

      import android.util.Pair
      

      【讨论】:

      • 不,甚至尝试过android.util.Pair.create(imageView, imageView.getTransitionName());
      • 你这样做后编译错误信息会改变吗?
      • 嗯,错误消息提到了 kotlin.Pair,所以它必须在你的代码中以某种方式使用,除非发生了一些奇怪的事情。请尝试创建minimal reproducible sample 并在此处发布 Kotlin 代码,以便我们进行调查并为您提供帮助。谢谢!
      • 我已经用我认为最小的可重复样本更新了我的答案。谢谢你的帮助
      【解决方案4】:

      这是我推荐的完整代码 sn-p:

      companion object {
          const val EXTRA_ITEM = "EXTRA_ITEM"
          const val TRANSITION_NAME_IMAGE = "TRANSITION_NAME_IMAGE"
          const val TRANSITION_NAME_TEXT = "TRANSITION_NAME_TEXT"
        }
      
        override fun onItemClick(pos: Int, item: Item, imageView: ImageView, textView: TextView) {
          val intent = Intent(context, YourActivity::class.java)
          intent.putExtra(EXTRA_ITEM, item)
          intent.putExtra(
            TRANSITION_NAME_IMAGE,
            ViewCompat.getTransitionName(imageView)
          )
          intent.putExtra(
            TRANSITION_NAME_TEXT,
            ViewCompat.getTransitionName(textView)
          )
      
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            val optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(
              context as Activity,
              androidx.core.util.Pair<View,String>(imageView, imageView.transitionName),
              androidx.core.util.Pair<View,String>(textView, textView.transitionName)
            )
            startActivity(intent, optionsCompat.toBundle())
          } else {
            startActivity(intent)
          }
        }
      

      您还必须在您的活动中实现此方法进行交易才能返回上一屏幕。

      override fun onOptionsItemSelected(item: MenuItem): Boolean {
          val id = item.itemId
          if (id == android.R.id.home) {
            supportFinishAfterTransition()
            return true
          }
          return super.onOptionsItemSelected(item)
        }
      

      【讨论】:

      • 准确。只有这个有效!使用 androidx.core.util 并将强制转换上下文作为 Activity 或使用 AppCompatActivity。恭喜!
      【解决方案5】:

      关键是像这样启动你的PairPair&lt;View, String&gt;(view, string),否则它会抱怨。

      【讨论】:

        猜你喜欢
        • 2019-01-11
        • 1970-01-01
        • 2020-09-30
        • 1970-01-01
        • 1970-01-01
        • 2021-03-14
        • 2021-10-16
        • 1970-01-01
        • 2016-04-28
        相关资源
        最近更新 更多