在kotlin中尝试makeSceneTransitionAnimation

问题描述 投票:0回答:3

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

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)

对不起,如果您发现这是一个重复的问题

android kotlin transitions
3个回答
0
投票

这与Java vs Kotlin无关。

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

context.getString(R.string.transition)

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中相关共享元素的位置将是其进入Transition的中心。

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

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

返回:返回一个新的ActivityOptions对象,可用于在启动活动时将这些选项作为选项Bundle提供。


0
投票

我有同样的问题。您需要通过将上下文转换为活动上下文来传递上下文

val options:ActivityOptions = ActivityOptions.makeSceneTransitionAnimation(context as Activity,holder.itemView.deliveryImageIV,context.getString(R.string.cardtransition))
© www.soinside.com 2019 - 2024. All rights reserved.