在kotlin

时间:2017-09-26 07:58:13

标签: android kotlin transitions

在学习kotlin时,我尝试为图像转换创建makeSceneTransitionAnimation,但它不像java那样工作,这是我的代码来自适配器类

itemView.imageContent.setOnClickListener {
    val i = Intent(context, ImagePreviewActivity::class.java)
    i.putExtra("IMAGE", item.content)
    val trans = context.getString(R.string.transition)
    val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
            Activity(), itemView.imageContent, trans
    )
    context.startActivity(i, options.toBundle())
}

这是我的logcat

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.view.Window.hasFeature(int)' on a null object reference
     at android.app.ActivityOptions.makeSceneTransitionAnimation(ActivityOptions.java:709)
     at android.app.ActivityOptions.makeSceneTransitionAnimation(ActivityOptions.java:648)
     at android.app.ActivityOptions.makeSceneTransitionAnimation(ActivityOptions.java:622)
     at android.support.v4.app.ActivityOptionsCompat.makeSceneTransitionAnimation(ActivityOptionsCompat.java:172)
     at com.docotel.binmaspublic.module.report.ReportAdapter$ViewHolder$bind$2.onClick(ReportAdapter.kt:130)

抱歉,如果您发现这是一个重复的问题

3 个答案:

答案 0 :(得分:0)

这与Java vs Kotlin无关。

R.string.transition是String资源的ID,它不是实际值 要获得您需要使用的值:

context.getString(R.string.transition)

答案 1 :(得分:0)

在这一行:

val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
        Activity(), itemView.imageContent, trans
)

您正在创建一个新的Android Activity实例。但是你必须通过当前的活动(在这种情况下可能是this@MyActivity)。

<强> Edito:
假设itemView.imageContent是imageView,item.content是字符串。您可以在适配器中实现calllback,并将OnClickListener中的代码移动到适配器创建。 这样的事。

class MyAdapter : YourBaseAdapter(/*args*/)  {

    var onItemClickListener = { view: ImageView, content: String -> }

   ///...
   itemView.imageContent.setOnClickListener {
    onItemClickListener(itemView.imageContent, item.content)
   }
   //...
} //end of MyAdapter

并在您的适配器类初始化集中:

myAdapter.onItemClickListener = { view, content ->
    val i = Intent(context, ImagePreviewActivity::class.java)
    i.putExtra("IMAGE", content)
    val trans = context.getString(R.string.transition)
    val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
        theReferenceOfYourActivity, view, trans
    )
    context.startActivity(i, options.toBundle())

}

您也可以将活动的引用传递给适配器构造函数,但我不推荐它。

来自 makeSceneTransitionAnimation doc:

  

使用跨活动场景动画创建一个ActivityOptions以在Activities之间转换。此方法将多个共享元素的位置带到已启动的Activity。 sharedElements中第一个元素的位置将用作退出Transition的震中。已启动的Activity中关联共享元素的位置   将成为其进入转型的中心。

     

这需要在调用Activity上启用android.view.Window.FEATURE_CONTENT_TRANSITIONS以导致退出转换。同样必须在被调用的Activity中进行转换。

     

<强>参数:
  activity - 其窗口包含共享元素的活动   sharedElements - 要传输到被调用Activity及其关联视图的共享元素的名称。每个视图必须具有唯一的共享元素名称。

     

<强>返回:   返回一个新的ActivityOptions对象,您可以使用该对象作为选项Bundle在启动活动时提供。

答案 2 :(得分:0)

我有同样的问题。 您需要通过将上下文强制转换为

这样的活动上下文来传递上下文
val options:ActivityOptions = ActivityOptions.makeSceneTransitionAnimation(context as Activity,holder.itemView.deliveryImageIV,context.getString(R.string.cardtransition))