У меня есть следующая проблема:
Я пытаюсь перейти от Fragment
A в Fragment
B. Существует общий элемент между этими фрагментами в форме Button
и некоторых других View's
(см. макет).
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:flipper="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.mypackage.view.IndicatorViewFlipper
android:transitionGroup="true"
android:id="@+id/intro_viewflipper"
android:layout_width="match_parent"
android:layout_height="match_parent"
flipper:indicatorColor="@color/white"
flipper:indicatorMargin="4dp"
flipper:indicatorRadius="4dp"
flipper:indicatorBarMargin="104dp"/>
<Button
android:id="@+id/account_create_btn"
style="?android:attr/borderlessButtonStyle"
android:textColor="@color/white"
android:layout_width="match_parent"
android:layout_height="@dimen/button_standard_height"
android:layout_above="@+id/txt_already_account"
android:background="@drawable/button_yellow_selector"
android:transitionName="create_account"
android:text="@string/account_create_btn"
android:textSize="24sp"
android:textAllCaps="false" />
<TextView
android:id="@+id/txt_already_account"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_above="@+id/account_login_btn"
android:layout_marginTop="24dp"
android:text="@string/account_welcome_already_account"/>
<Button
android:id="@+id/account_login_btn"
style="?android:attr/borderlessButtonStyle"
android:layout_width="match_parent"
android:layout_height="@dimen/button_standard_height"
android:layout_marginTop="8dp"
android:layout_alignParentBottom="true"
android:transitionName="login"
android:background="@drawable/button_blue_selector"
android:textColor="@color/white"
android:textSize="24sp"
android:textAllCaps="false"
android:text="@string/account_create_login_btn"/>
</RelativeLayout>
То, что я пытаюсь сделать, это разрешить весь контент в Fragment
, за исключением общего элемента, перехода (сдвинуть влево) и разрешить всю форму содержимого Fragment
B, за исключением того, что общий элемент перемещается в справа. Во время этого перехода содержимого я хочу, чтобы общий элемент оставался в исходном положении до тех пор, пока не будут выполнены переходы контента, а затем пусть он переместится в новое положение в Fragment
B.
Последнее поведение - это ошибка: когда я начинаю переход на выход в Fragment
A, общий элемент исчезает и сместится справа с переходом содержимого Fragment
B. Поведение общего элемента если я не добавляю переходы выхода/ввода.
Код (в Fragment
A):
Fragment fragment = MyFragment.newInstance();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.hide(this);
fragmentTransaction.add(R.id.frame_container, fragment, fragment.getClass().getSimpleName());
fragmentTransaction.addSharedElement(sharedElement, sharedElementTag);
Transition sharedElementTransaction = TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move);
sharedElementTransaction.setStartDelay(400);
fragment.setSharedElementEnterTransition(sharedElementTransaction);
setExitTransition(new Slide(Gravity.LEFT).setDuration(200));
fragment.setEnterTransition(new Slide(Gravity.RIGHT).setDuration(200));
Может ли кто-нибудь помочь мне получить желаемое поведение?
Update:
Я сделал работу, которая почти делает то, что я хочу использовать animate()
для своих просмотров, чтобы слайд/исчезать, и по завершении этой анимации запускает транзакцию с общим элементом:
Transition sharedElementTransition = TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move);
sharedElementTransition.setStartDelay(400);
fragment.setSharedElementEnterTransition(sharedElementTransition);
setSharedElementReturnTransition(sharedElementTransition);
mLoginBtn.animate()
.x(-mLoginBtn.getWidth())
.setDuration(400)
.start();
viewFlipper.animate()
.x(-viewFlipper.getWidth())
.setDuration(400)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
transaction.commit();
}
})
.start();
fragment.setEnterSharedElementCallback(new SharedElementCallback() {
@Override
public void onSharedElementStart(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) {
super.onSharedElementStart(sharedElementNames, sharedElements, sharedElementSnapshots);
viewFlipper.animate()
.x(0)
.setDuration(400)
.setListener(null)
.start();
mLoginBtn.animate()
.x(0)
.setDuration(400)
.start();
});
Проблема с этим решением заключается в том, что я не могу скользить в Views
вызываемого Fragment
, поэтому теперь я просто исчезаю в Views
.