在学习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)
抱歉,如果您发现这是一个重复的问题
答案 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))