在学习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)
对不起,如果您发现这是一个重复的问题
这与Java vs Kotlin无关。
R.string.transition
是String资源的ID,它不是实际值。
要获得您需要使用的值:
context.getString(R.string.transition)
在这一行:
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提供。
我有同样的问题。您需要通过将上下文转换为活动上下文来传递上下文
val options:ActivityOptions = ActivityOptions.makeSceneTransitionAnimation(context as Activity,holder.itemView.deliveryImageIV,context.getString(R.string.cardtransition))