У меня следующая проблема:Общие элементы и переходы содержимого в виде фрагментов
Я пытался перейти от А до Fragment
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
. Общий элемент исчезнет и сместится справа с переходом содержимого 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
.
Глупый вопрос, но вы изучили [сцены] (https://developer.android.com/training/transitions/scenes.html). Вы могли бы предоставить те же идентификаторы элементов, а затем могли бы быть предусмотрены переходы (или удалены) к требуемым элементам. – Droidekas
@Droidekas Я посмотрел на Сцены, но я не уверен, как использовать их для решения моей проблемы ... Я сделал работу, которая делает почти то, что я хочу, я обновлю свой вопрос с помощью текущее решение. Но все еще ищут способ сделать это с помощью платформы Transitions. – Joris
Это может помочь в обсуждении, если вы можете уточнить, почему вам нужны два разных экземпляра кнопок в двух фрагментах, если обе кнопки будут совместно использовать один визуальный «вид» для пользователя. Если пользователь просто видит одну кнопку ... тогда почему бы не иметь один экземпляр Button (поддерживаемый активностью или, возможно, другим фрагментом одной цели), а затем позволить вашим двум фрагментам контента каким-то образом получить ссылки на него? –