На самом деле я столкнулся с той же проблемой, что и OP на Android 10+ (от этого также страдает предварительный просмотр 11 dev). Я потратил на это около 2 недель, поэтому я попытаюсь обобщить свои выводы и хак, как мне удалось исправить это в моем проекте.
Итак, я обнаружил, что если вызвать код, который ppxpp опубликовал в качестве ответа, он помогает, когда экран поворачивается (или любое другое изменение конфигурации).
Затем я обнаружил, что лучше сохранить все имена общих элементов в массиве строк в onSaveInstanceState()
следующим образом:
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
sharedElementList?.run {
outState.putStringArrayList(PENDING_EXIT_SHARED_ELEMENTS, ArrayList(this))
}
}
}
где const val PENDING_EXIT_SHARED_ELEMENTS = "android:pendingExitSharedElements"
это константа, определенная в состояние перехода
И чтобы получить sharedElementList
, вы можете вызвать это в onCreate()
setEnterSharedElementCallback(object : SharedElementCallback() {
override fun onSharedElementsArrived(sharedElementNames: MutableList<String>?, sharedElements: MutableList<View>?, listener: OnSharedElementsReadyListener?) {
super.onSharedElementsArrived(sharedElementNames, sharedElements, listener)
sharedElementList = sharedElementNames?.toList()
}
}
Далее, действие действительно необходимо воссоздать, чтобы это имело эффект, поэтому только добавление этого заставит его работать, если вы повернете экран в действии B.
Поэтому я вызываю recreate()
в действии B примерно через 500-1000 мс после открытия действия C. Таким образом, переход не запаздывает.
Просто будьте осторожны при вызове supportPostponeEnterTransition()
и startPostponedEnterTransition()
, потому что, если они вызывают их при входе в Activity B, они будут вызваны снова после recreate()
В общем, достаточно вызвать повторное создание один раз, поэтому я сам сохраняю локальный флаг в действии B, чтобы знать, было ли это действие уже воссоздано или еще нет, так что я не делаю это без необходимости слишком много каждый раз, когда я идти от B до C и обратно.
В целом, это просто хакерское решение высокого уровня, и я имел дело со многими другими проблемами, имеющими recyclerviews в каждом действии, что усложняло ситуацию.
Если вы найдете что-то лучше, пожалуйста, прокомментируйте, я бы хотел это услышать, но я не могу больше тратить на это время, так как мне было достаточно двух недель изучения исходного кода Android и сравнения API28 и 29: D
person
user1071762
schedule
10.07.2020