Ответ 1
Способ работы переходов требует создания, измерения и компоновки нового действия до того, как произойдут какие-либо анимации. Это позволяет найти представление, которое вы хотите оживить, и создать соответствующую анимацию.
В вашем случае это не происходит, потому что, как указано в документах, все 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;
}
});
}
Благодаря Алексу Локвуду за его подробные сообщения в блоге о структуре переходов.