Intereting Posts

Переход общего элемента: активность в фрагмент, вложенный в другую активность

Я пытаюсь добавить общий переход элемента в мое приложение.

Сценарий заключается в том, что пользователь нажимает на миниатюру изображения, чем открывает другое действие с полноэкранным просмотром изображения.

Это отлично работает, если общий вид размещается непосредственно в макете целевой активности. Работает сглаженно для анимации ввода / выхода. Но когда я пытаюсь добиться подобного эффекта внутри фрагмента, который вложен в целевую активность, этот подход не работает . Смешно, что анимация ввода не отображается, но анимация выхода работает нормально.

Другая еще более сложная иерархия представлений заключается в том, что если целевое представление (ImageView) размещено в представлении пейджера, который размещается в макете кадра целевой активности.

У кого-то была такая же проблема?

Изменить: мой код прослушивания кликов

public class OnClickPicture extends OnClickBase { private ObjectPicture object; public OnClickPicture(Activity_Parent activity, ObjectPicture object) { super(activity); this.object = object; } public void onClick(View v) { picasso.load(object.getFullUrl()).fetch(); Intent intent = new Intent(activity, ActivityPicture.class); intent.putExtra("picture_object", helper.gson.toJson(object)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && v != null) { Pair<View, String> p1 = Pair.create(v, "image"); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, p1); activity.startActivity(intent, options.toBundle()); } else { activity.startActivity(intent); } } } 

Solutions Collecting From Web of "Переход общего элемента: активность в фрагмент, вложенный в другую активность"

То, как работают переходы, требует, чтобы новое действие создавалось, измерялось и выкладывалось до того, как произойдут какие-либо анимации. Это значит, что он может найти представление, которое вы хотите оживить, и создать соответствующую анимацию.

В вашем случае это не происходит, потому что, как указано в документах , все FragmentTransaction.commit () – это работа по расписанию. Это происходит не сразу. Поэтому, когда среда создает свою активность, она не может найти представление, которое вы хотите оживить. Вот почему вы не видите анимацию записи, но видите анимацию выхода. Вид есть, когда вы покидаете действие.

Решение достаточно простое. Прежде всего, вы можете попробовать FragmentManager.executePendingTransactions () . Этого может быть недостаточно. Рамка переходов имеет другое решение:

В onCreate of Activity postponeEnterTransition () . Это говорит платформе ждать, пока вы скажете, что ее безопасно создать анимацию. Это означает, что вам нужно сказать, что его сейф (через вызов startPostponedEnterTransition () ) в какой-то момент. В вашем случае это, вероятно, будет в Fragments onCreateView.

Вот пример того, как это может выглядеть:

Активность B

 @Override protected void onCreate(Bundle savedInstanceState) { // etc postponeEnterTransition(); } 

Фрагмент B

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View sharedView = root.findViewById(R.id.shared_view); sharedview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { sharedview.getViewTreeObserver().removeOnPreDrawListener(this); getActivity().startPostponedEnterTransition(); return true; } }); } 

Благодаря Алексу Локвуду за подробные сообщения в блоге о структуре Transitions .