У меня странный сбой, который, по-видимому, не может быть исправлен, происходит на устройствах Samsung только под управлением Android 8.0.
У меня recyclerView, заполненный во фрагменте, который запускает действие.
Вот мой макет ItemHolder
<FrameLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:orientation = "vertical"
android:layout_width = "match_parent"
android:layout_height = "@dimen/table_card_header_size"
android:transitionName = "@string/team_profile_transition"
android:id = "@+id/tableRowMainContainer"
android:background = "@drawable/rounded_rect_top"
> ...
Вот мое намерение к действию с общим элементом
private val teamProfileOnClick = View.OnClickListener { v ->
val teamContainer = v.findViewById<FrameLayout>(R.id.tableRowMainContainer)
val tag = v.tag as TableRow
val intent = Intent(context, TeamProfileActivity::class.java)
intent.putExtra(TeamProfileActivity.TEAM_ID_PROFILE, tag.teamId)
intent.putExtra(TeamProfileActivity.TEAM_NAME, tag.team.name)
intent.putExtra(TeamProfileActivity.TEAM_COMPETITION_ID, tableCompetitionId)
intent.putExtra(TeamProfileActivity.TEAM_TYPE, tag.team.teamType)
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(context as Activity,
teamContainer,
ViewCompat.getTransitionName(teamContainer))
context.startActivity(intent, options.toBundle())
}
А вот макет целевой активности
<FrameLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tool = "http://schemas.android.com/tools"
android:id = "@+id/cardview"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:fitsSystemWindows = "true"
android:transitionName = "@string/team_profile_transition"
app:cardCornerRadius = "10dp"
> ...
Вот журнал сбоев
java.lang.NullPointerException:
at android.app.ActivityTransitionCoordinator.setSharedElementState (ActivityTransitionCoordinator.java:553)
at android.app.ActivityTransitionCoordinator.setSharedElementState (ActivityTransitionCoordinator.java:653)
at android.app.EnterTransitionCoordinator.startSharedElementTransition (EnterTransitionCoordinator.java:428)
at android.app.EnterTransitionCoordinator.-wrap4 (Unknown Source)
at android.app.EnterTransitionCoordinator$3.lambda$-android_app_EnterTransitionCoordinator$3_18867 (EnterTransitionCoordinator.java:492)
at android.app.-$Lambda$CsyQO--8YdRe5wlajUCi-L98enA$1.$m$0 (Unknown Source:8)
at android.app.-$Lambda$CsyQO--8YdRe5wlajUCi-L98enA$1.run (Unknown Source)
at android.app.ActivityTransitionCoordinator.startTransition (ActivityTransitionCoordinator.java:902)
at android.app.EnterTransitionCoordinator$3.lambda$-android_app_EnterTransitionCoordinator$3_18819 (EnterTransitionCoordinator.java:491)
at android.app.-$Lambda$CsyQO--8YdRe5wlajUCi-L98enA$2.$m$0 (Unknown Source:8)
at android.app.-$Lambda$CsyQO--8YdRe5wlajUCi-L98enA$2.run (Unknown Source)
at com.android.internal.view.OneShotPreDrawListener.onPreDraw (OneShotPreDrawListener.java:78)
at android.view.ViewTreeObserver.dispatchOnPreDraw (ViewTreeObserver.java:1045)
at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2800)
at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1779)
at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:7810)
at android.view.Choreographer$CallbackRecord.run (Choreographer.java:911)
at android.view.Choreographer.doCallbacks (Choreographer.java:723)
at android.view.Choreographer.doFrame (Choreographer.java:658)
at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:897)
at android.os.Handler.handleCallback (Handler.java:789)
at android.os.Handler.dispatchMessage (Handler.java:98)
at android.os.Looper.loop (Looper.java:164)
at android.app.ActivityThread.main (ActivityThread.java:6938)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)
Как вы в итоге решили это?
Да, я сделал. Пожалуйста, проверьте мое решение
Я нашел следующее решение: Заморозить / разморозить recyclerView при открытии общего элемента:
override fun onPause() {
super.onPause()
tableCardStack.isLayoutFrozen = true
}
override fun onResume() {
super.onResume()
tableCardStack.isLayoutFrozen = false
}
Я заметил, что вид, который я анимировал, не возвращался в правильное положение. Вот и решил заморозить макет. Я знаю, что это не лучшее решение, но лучше не нашел
Похоже, что некоторые устройства Samsung не проверяют, является ли родительский элемент представления null, что может произойти в некоторых крайних случаях. Вы можете предотвратить этот сбой, удалив представления без родителей из перехода. Это делается путем добавления SharedElementCallback к вашей активности и перезаписи onSharedElementEnd и / или onSharedElementStart (в зависимости от того, происходит ли сбой вашего перехода Enter или Exit), а затем поиска и удаления таких представлений:
activity.setEnterSharedElementCallback(object : SharedElementCallback() {
override fun onSharedElementStart(sharedElementNames: MutableList<String>?, sharedElements: MutableList<View>?, sharedElementSnapshots: MutableList<View>?) {
sharedElements?.removeAll(sharedElements.filter { it.parent == null })
super.onSharedElementStart(sharedElementNames, sharedElements, sharedElementSnapshots)
}
override fun onSharedElementEnd(sharedElementNames: MutableList<String>?, sharedElements: MutableList<View>?, sharedElementSnapshots: MutableList<View>?) {
sharedElements?.removeAll(sharedElements.filter { it.parent == null })
super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots)
}
}
Имейте в виду, что это не устраняет основную причину сбоя, а только предотвращает его появление, не анимируя представление без родителя.
Вы решили эту проблему? у меня есть такой же