在kotlin中尝试makeSceneTransitionAnimation

而学习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) 

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

这与Java vs Kotlin无关。

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

 context.getString(R.string.transition) 

在这一行上:

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

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

Edito:
假设item.contentitem.content ,而item.content是一个字符串。 您可以在适配器中实现回调,并将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文档:

创建一个ActivityOptions以使用交叉活动场景动画在活动之间转换。 该方法将多个共享元素的位置传递给启动的Activity。 sharedElements中第一个元素的位置将被用作退出过渡的中心。 相关共享元素在已启动活动中的位置将成为其进入过渡的中心。

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

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

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