Переход общего элемента не работает в Android 10 (Q) при возврате к callActivity

Получил это только в android-10 (Q) и отлично работает в пироге Android и ниже уровня API. Я пытался работать с переходом sharedElement. От элемента recyclerView к новой активности. Он отлично работает, когда я работаю с двумя действиями, то есть из действия A -> действие B и возврата из действия B -> действие A. Работая с тремя действиями A, B и C.

Для двух действий

Activity A -> Activity B через переход sharedElement и Activity B -> Activity C без каких-либо переходов. После этого Activity C -> Activity B -> Activity A.

Для трех действий

Переход SharedElement не работает из Activity B -> Activity A.


person Jeeva Nantham    schedule 10.12.2019    source источник
comment
Я также сталкиваюсь с той же проблемой. Вы нашли какое-нибудь решение?   -  person RajaKumar    schedule 09.06.2020


Ответы (2)


Вы можете попробовать добавить эти коды в метод onStop ActivityB.

override fun onStop() {
    if (!isFinishing && Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {    
        Instrumentation().callActivityOnSaveInstanceState(this, Bundle())
    }
    super.onStop()
}

Я использую метод, чтобы избежать этой проблемы.

person ppxpp    schedule 03.03.2020
comment
Спасибо, похоже, это работает, если нет перехода от B->C, а только от A->B. Так что это частично решает проблему. Вы случайно не нашли решение, которое также работало бы для нескольких общих переходов элементов между 3 и более действиями? - person user1071762; 24.06.2020

На самом деле я столкнулся с той же проблемой, что и 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