在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.content
是item.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提供。
- 在Instant App中应用插件“kotlin-android”会导致“null不能转换为非空类型的com.android.build.gradleBasePlugin”
- 可见性不适用于Kotlin
- Android Studio 3 Canary中未解决的参考
- 用fillafter(true)|查看 kotlin | Android
- 使用Kotlin的房间,建立数据库时得到异常
- 定时器崩溃KotlinNullPointerException内部片段
- 当我在java中使用DigestUtils.md5Hex时,得到了错误的结果
- 在Android Kotlin应用程序中如何处理大数目?
- Kotlin的可派生派生类