во время обучения 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()) }
это мой логарифм
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 и Kotlin.
R.string.transition
– это идентификатор для ресурса String, это не фактическое значение.
Чтобы получить значение, которое вам нужно использовать:
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 :
Создайте ActivityOptions для перехода между действиями с использованием анимации анимации кросс-активности. Этот метод переносит положение нескольких общих элементов в начальную активность. Позиция первого элемента в sharedElements будет использоваться в качестве эпицентра для выхода Transition. Позиция связанного совместно используемого элемента в запущенной деятельности будет эпицентром его входного перехода.
Для этого необходимо включить android.view.Window.FEATURE_CONTENT_TRANSITIONS в вызывающей активности, чтобы вызвать переход на выход. То же самое должно быть в вызываемой активности, чтобы получить переход ввода.
Параметры:
activity
– Activity, в окне которого содержатся общие элементы.
sharedElements
– имена общих элементов для передачи вызываемой активности и связанных с ними представлений. Каждый из представлений должен иметь уникальное имя общего элемента.Возвращает: возвращает новый объект ActivityOptions, который можно использовать для предоставления этих опций в качестве опций Bundle при запуске операции.