2015-02-24 5 views
10

У меня следующая проблема:Общие элементы и переходы содержимого в виде фрагментов

Я пытался перейти от А до FragmentFragment 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для общего элемента, переход (слайд слева), за исключением, и пусть все форма содержания FragmentB за исключением совместно элемент Слайд справа. Во время этого перехода содержимого я хочу, чтобы общий элемент оставался в исходном положении до тех пор, пока не будут выполнены переходы контента, а затем переместится в новое положение в 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.

+0

Глупый вопрос, но вы изучили [сцены] (https://developer.android.com/training/transitions/scenes.html). Вы могли бы предоставить те же идентификаторы элементов, а затем могли бы быть предусмотрены переходы (или удалены) к требуемым элементам. – Droidekas

+0

@Droidekas Я посмотрел на Сцены, но я не уверен, как использовать их для решения моей проблемы ... Я сделал работу, которая делает почти то, что я хочу, я обновлю свой вопрос с помощью текущее решение. Но все еще ищут способ сделать это с помощью платформы Transitions. – Joris

+0

Это может помочь в обсуждении, если вы можете уточнить, почему вам нужны два разных экземпляра кнопок в двух фрагментах, если обе кнопки будут совместно использовать один визуальный «вид» для пользователя. Если пользователь просто видит одну кнопку ... тогда почему бы не иметь один экземпляр Button (поддерживаемый активностью или, возможно, другим фрагментом одной цели), а затем позволить вашим двум фрагментам контента каким-то образом получить ссылки на него? –

ответ

0

Если вам нужно только оживить фрагменты, пока кнопка остается неподвижной, вы можете переместить кнопку в действие и оживить фрагмент.

Смежные вопросы