Я пытаюсь сделать свой первый общий переход между RecyclerView
с разметкой сетки и действием подробностей.
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_cryptocurrencies"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"
android:overScrollMode="never" />
Для начала, transitionName
установлен на "cryptocurrency_name" в обоихмакет детали и макет RecyclerView
.
<!-- RecyclerView's item layout -->
<TextView
style="@style/CurrencyTextView"
android:id="@+id/tv_cryptocurrency_name"
android:textSize="20sp"
android:maxLength="12"
android:transitionName="cryptocurrency_name"
tools:text="Bitcoin" />
...
<!-- Details -->
<TextView
android:id="@+id/tv_cryptocurrency_detail_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Bitcoin"
android:textSize="32sp"
android:transitionName="cryptocurrency_name"
.../>
MainActivity
переопределенный метод из адаптера:
private var tvCryptocurrencyName: TextView? = null
tvCryptocurrencyName = rv_cryptocurrencies.findViewById(R.id.tv_cryptocurrency_name)
override fun onItemClick(cryptocurrency: Cryptocurrency) {
val intent = Intent(this, DetailActivity::class.java)
val options = ActivityOptions.makeSceneTransitionAnimation(this, tvCryptocurrencyName, "cryptocurrency_name")
intent.putExtra(EXTRA_STRING_CRYPTOCURRENCY_DETAILS, cryptocurrency)
startActivity(intent, options.toBundle())
}
Метод, который вызывается при нажатии на элемент,установить в качестве интерфейса в адаптере:
interface OnItemClickListener {
fun onItemClick(cryptocurrency: Cryptocurrency)
}
override fun onBindViewHolder(holder: MainViewHolder, position: Int) {
val cryptocurrency = cryptocurrenciesList[position]
holder.populateUi(cryptocurrency)
holder.itemView.setOnClickListener { onItemClickListener?.onItemClick(cryptocurrenciesList[position]) }
}
Когда я нажимаю, чтобы увидеть результаты, приложение вылетает с сообщением
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.gabriel.cryptocurrencies, PID: 4416
java.lang.IllegalArgumentException: Shared element must not be null
at android.app.ActivityOptions.makeSceneTransitionAnimation(ActivityOptions.java:694)
at android.app.ActivityOptions.makeSceneTransitionAnimation(ActivityOptions.java:649)
at com.example.gabriel.cryptocurrencies.ui.main.MainActivity.onItemClick(MainActivity.kt:50)
at com.example.gabriel.cryptocurrencies.ui.main.MainAdapter$onBindViewHolder$1.onClick(MainAdapter.kt:36)
at android.view.View.performClick(View.java:6261)
at android.view.View$PerformClick.run(View.java:23752)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
и другими учебниками, это все, что мне нужноделать.Возможно, способ, которым я пытаюсь получить доступ к полю из макета RecyclerView
, неправильный?
Редактировать
Обновленный, но все же ошибочный код.Теперь кажется, что анимация остановится, потому что когда я нажимаю кнопку «Назад», она не покидает приложение, только если я нажимаю дважды.Кроме того, при редактировании кода и развертывании изменений приложение загружает представление сведений после попытки переключения на представление сведений.
MainActivity
:
override fun onItemClick(cryptocurrency: Cryptocurrency, field: View) {
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra(EXTRA_CRYPTOCURRENCY_DETAILS, cryptocurrency)
intent.putExtra(EXTRA_TRANSITION_NAME, cryptocurrency.id)
val options = ActivityOptions.makeSceneTransitionAnimation(this, field, cryptocurrency.id)
startActivity(intent, options.toBundle())
}
MainAdapter
:
val tvCryptocurrencyName = holder.itemView.tv_cryptocurrency_name
interface OnItemClickListener {
fun onItemClick(cryptocurrency: Cryptocurrency, field: View)
}
holder.itemView.setOnClickListener { onItemClickListener?.onItemClick(cryptocurrenciesList[position], tvCryptocurrencyName) }