Suche…


Einführung

Hier finden Sie Beispiele für den Übergang zwischen Activities oder Fragments mit einem gemeinsamen Element. Ein Beispiel für dieses Verhalten ist die Google Play Store App, die das Symbol einer App aus der Liste in die Detailansicht der App übersetzt.

Syntax

  • transaction.addSharedElement (sharedElementView, "targetTransitionName");
  • fragment.setSharedElementEnterTransition (new CustomTransaction ());

Gemeinsamer Elementübergang zwischen zwei Fragmenten

In diesem Beispiel sollte eine von zwei verschiedenen ImageViews vom ChooserFragment in das DetailFragment .

Im ChooserFragment Layout benötigen wir die eindeutigen transitionName Attribute:

<ImageView
    android:id="@+id/image_first"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_first"
    android:transitionName="fistImage" />

<ImageView
    android:id="@+id/image_second"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_second"
    android:transitionName="secondImage" />

In der ChooserFragments Klasse müssen wir die angeklickte View und eine ID an die übergeordnete Activity , die den Austausch der Fragmente DetailFragment (wir benötigen die ID, um zu wissen, welche DetailFragment im DetailFragment ). Wie Sie Informationen an eine übergeordnete Aktivität im Detail weitergeben, wird in einer anderen Dokumentation beschrieben.

view.findViewById(R.id.image_first).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (mCallback != null) {
            mCallback.showDetailFragment(view, 1);
        }
    }
});

view.findViewById(R.id.image_second).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (mCallback != null) {
            mCallback.showDetailFragment(view, 2);
        }
     }
});

In DetailFragment die ImageView des gemeinsam genutzten Elements auch das eindeutige Attribut transitionName .

<ImageView
    android:id="@+id/image_shared"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:transitionName="sharedImage" />

In der onCreateView() -Methode von DetailFragment müssen wir entscheiden, welche DetailFragment angezeigt werden soll (wenn dies nicht der DetailFragment ist, wird das gemeinsam genutzte Element nach dem Übergang nicht mehr angezeigt).

public static DetailFragment newInstance(Bundle args) {
    DetailFragment fragment = new DetailFragment();
    fragment.setArguments(args);
    return fragment;
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.fragment_detail, container, false);

    ImageView sharedImage = (ImageView) view.findViewById(R.id.image_shared);

    // Check which resource should be shown.
    int type = getArguments().getInt("type");

    // Show image based on the type.
    switch (type) {
        case 1:
            sharedImage.setBackgroundResource(R.drawable.ic_first);
            break;

        case 2:
            sharedImage.setBackgroundResource(R.drawable.ic_second);
            break;
    }

    return view;
}

Die übergeordnete Activity empfängt die Rückrufe und übernimmt das Ersetzen der Fragmente.

@Override
public void showDetailFragment(View sharedElement, int type) {
    // Get the chooser fragment, which is shown in the moment.
    Fragment chooserFragment = getFragmentManager().findFragmentById(R.id.fragment_container);

    // Set up the DetailFragment and put the type as argument.
    Bundle args = new Bundle();
    args.putInt("type", type);
    Fragment fragment = DetailFragment.newInstance(args);

    // Set up the transaction.
    FragmentTransaction transaction = getFragmentManager().beginTransaction();

    // Define the shared element transition.
    fragment.setSharedElementEnterTransition(new DetailsTransition());
    fragment.setSharedElementReturnTransition(new DetailsTransition());

    // The rest of the views are just fading in/out.
    fragment.setEnterTransition(new Fade());
    chooserFragment.setExitTransition(new Fade());

    // Now use the image's view and the target transitionName to define the shared element.
    transaction.addSharedElement(sharedElement, "sharedImage");

    // Replace the fragment.
    transaction.replace(R.id.fragment_container, fragment, fragment.getClass().getSimpleName());

    // Enable back navigation with shared element transitions.
    transaction.addToBackStack(fragment.getClass().getSimpleName());

    // Finally press play.
    transaction.commit();
}

Nicht zu vergessen - der Transition selbst. In diesem Beispiel wird das gemeinsam genutzte Element verschoben und skaliert.

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class DetailsTransition extends TransitionSet {

    public DetailsTransition() {
        setOrdering(ORDERING_TOGETHER);
        addTransition(new ChangeBounds()).
            addTransition(new ChangeTransform()).
            addTransition(new ChangeImageTransform());
    }

}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow