Ответ 1
Вероятно, вы уже нашли ответ на этот вопрос, но в случае, если вы этого не сделали, вот что я сделал, чтобы исправить это через несколько часов царапин на голове.
Проблема, о которой я думаю, представляет собой комбинацию двух факторов:
-
Загрузка
Fragmnets
inViewPager
с задержкой, что означает, что активность возвращается намного быстрее, чем ее фрагменты, которые содержатся внутриViewPager
-
Если вы похожи на меня, то ваши дочерние фрагменты
ViewPager
, скорее всего, будут одного и того же типа. Это означает, что все они имеют одно и то же имя перехода (если вы указали их в своем макете xml), , если вы не установите их в коде и только установите его один раз, на видимый фрагмент.
Чтобы исправить обе эти проблемы, это то, что я сделал:
1. Фиксирование проблемы с задержкой загрузки:
Внутри вашей активности (той, которая содержит ViewPager
), добавьте эту строку после super.onCreate()
и до setContentView()
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCompat.postponeEnterTransition(this); // This is the line you need to add
setContentView(R.layout.feeds_content_list_activity);
...
}
2. Фиксирование проблемы с несколькими фрагментами с одним и тем же именем перехода:
Теперь есть довольно много способов сделать это, но это то, что у меня получилось внутри моего "подробного" действия, то есть активности, которая содержит ViewPager
(в onCreate()
, но вы можете это сделать где угодно):
_viewPager.setAdapter(_sectionsPagerAdapter);
_viewPager.setCurrentItem(position);
...
...
_pagerAdapter.getItem(position).setTransitionName(getResources().getString(R.string.transition_contenet_topic));
Вам нужно быть осторожным, так как Activity
может еще не прикрепляться к вашему фрагменту ViewPager
, поэтому проще просто передать имя перехода из операции в фрагмент, если вы загружаете его из ресурса
Фактическая реализация так же проста, как вы ожидаете:
public void setTransitionName(String transitionName) {
_transitionName = transitionName;
}
Затем внутри фрагмента onViewCreated()
добавьте эту строку:
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
...
if (_transitionName != null && android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
setTransitionNameLollipop();
}
...
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setTransitionNamesLollipop() {
_imgTopic.setTransitionName(_transitionName);
}
Последний фрагмент головоломки заключается в том, чтобы узнать, когда ваш фрагмент полностью загружен, а затем вызовите ActivityCompat.startPostponedEnterTransition(getActivity());
.
В моем случае мои фрагменты не были полностью загружены до тех пор, пока я загружаю большинство вещей из потока пользовательского интерфейса, а это значит, что мне нужно было выяснить способ вызова этого, когда все было загружено, но если это не ваше дело, вы может вызвать это право после вызова setTransitionNameLollipop()
.
Проблема с этим подходом заключается в том, что переход на выход может не работать, если вы не очень осторожны и reset имя перехода на "видимом" фрагменте прямо перед вами exit
активность для перехода назад. Это можно сделать следующим образом:
- Прослушайте изменение страницы на
ViewPager
- Удалите имена (имена) перехода, как только ваш фрагмент не отображается.
- Установите имя перехода на видимый фрагмент.
- Вместо вызова
finish()
вызовитеActivityCompat.finishAfterTransition(activity);
Это может стать очень сложным очень скоро, если вам потребуется переход, чтобы перейти к RecyclerView
, который был моим делом. Для этого есть гораздо лучший ответ, предоставленный @Alex Lockwood здесь: Фрагменты ViewPager - Переходы с общим элементом, который имеет очень хорошо написанный примерный код (хотя намного сложнее, чем что я только что написал) здесь: https://github.com/alexjlockwood/activity-transitions/tree/master/app/src/main/java/com/alexjlockwood/activity/transitions
В моем случае мне не пришлось заходить так далеко, чтобы реализовать его решение, и вышеприведенное решение, которое я написал для моего дела.
Если у вас несколько общих элементов, я уверен, что вы можете выяснить, как расширить методы, чтобы удовлетворить их.