2015-02-24 4 views
10

Ich habe folgendes Problem:Gemeinsame Elemente und Inhaltsübergänge in Fragmente

I von Fragment A bis Fragment B. den Übergang bin versucht Es ist ein gemeinsames Element, das zwischen diesen Fragmenten in Form eines Button und einige andere View's (siehe Layout).

<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> 

Was ich versuche zu tun, alle Inhalte lassen in Fragmentmit Ausnahme des gemeinsamen Element, Übergang (Folie nach links) und lassen Sie den gesamten Inhalt Form Fragment B mit Ausnahme der gemeinsamen Element von rechts einschieben. Während dieses Inhaltsübergangs möchte ich, dass das freigegebene Element in seiner ursprünglichen Position bleibt, bis die Inhaltsübergänge fertig sind, und es dann an seine neue Position gleiten lässt. Dieses letzte Verhalten ist dort, wo es schief geht: einmal I Starten Sie den Exit-Übergang in Fragment A das gemeinsame Element verschwindet und von rechts mit dem Inhalt Übergang von Fragment B eingefügt. Das Verhalten des freigegebenen Elements ist korrekt, wenn ich keine Exit/Enter-Übergänge hinzufügen.

Der Code (in 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)); 

Kann mir jemand helfen, das gewünschte Verhalten zu bekommen?

Update:

ich um das gemacht habe ein Werk fast tut, was ich will animate() auf meine Ansichten mit ihnen zu gleiten/verblassen und nach Abschluss dieser Animation auslösen das gemeinsame Element Transaktion:

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(); 
    }); 

Das Problem mit dieser Lösung ist, dass ich nicht in die Views der genannten Fragment schieben kann, so dass ich jetzt nur die Views verblassen.

+0

Dumme Frage, aber haben Sie in [Szenen] (https://developer.android.com/training/transitions/scenes.html) untersucht. Sie könnten die gleichen Element IDs geben und dann die Übergänge bereitgestellt werden (oder entfernt werden können)) zu den erforderlichen Elementen. – Droidekas

+0

@Droidekas Ich habe mir Szenen angesehen, aber ich bin mir nicht sicher, wie man sie benutzt, um mein Problem zu lösen ... Ich habe eine Arbeit gemacht, die fast das tut, was ich will, ich werde meine Frage mit der aktualisieren aktuelle Lösung. Aber immer noch auf der Suche nach einer Möglichkeit, dies mit dem Transitions-Framework zu tun. – Joris

+0

Es könnte die Diskussion erleichtern, wenn Sie erläutern könnten, warum Sie die zwei verschiedenen Schaltflächeninstanzen in den beiden Fragmenten benötigen, wenn die beiden Schaltflächen tatsächlich eine einzige visuelle "Ansicht" für den Benutzer haben. Wenn der Benutzer nur eine einzelne Schaltfläche sieht ... warum dann nicht eine einzelne Button-Instanz (die von der Aktivität verwaltet wird, oder vielleicht ein anderes Einzweckfragment) und dann lassen Sie Ihre zwei Inhaltsfragmente irgendwie darauf verweisen? –

Antwort

0

Wenn Sie nur die Fragmente animieren müssen, während die Schaltfläche inaktiv bleibt, können Sie die Schaltfläche auf die Aktivität verschieben und das Fragment animieren.

Verwandte Themen