Zoeken…


Invoering

Hier vindt u voorbeelden voor de overgang tussen Activities of Fragments met behulp van een gedeeld element. Een voorbeeld voor dit gedrag is de Google Play Store-app die het pictogram van een app vertaalt van de lijst naar de detailweergave van de app.

Syntaxis

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

Gedeelde elementovergang tussen twee fragmenten

In dit voorbeeld moet een van de twee verschillende ImageViews worden vertaald van de ChooserFragment naar de DetailFragment .

In de ChooserFragment out ChooserFragment hebben we de unieke attributen transitionName nodig:

<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 de klasse ChooserFragments moeten we de View waarop is geklikt en een ID doorgeven aan de bovenliggende Activity die de vervanging van de fragmenten DetailFragment (we hebben de ID nodig om te weten welke afbeeldingsresource moet worden weergegeven in de DetailFragment ). Hoe u informatie gedetailleerd aan een ouderactiviteit kunt doorgeven, wordt zeker behandeld in een andere documentatie.

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 de DetailFragment heeft de ImageView van het gedeelde element ook het unieke kenmerk transitionName .

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

Bij de methode onCreateView() van DetailFragment moeten we beslissen welke afbeeldingsresource moet worden weergegeven (als we dat niet doen, verdwijnt het gedeelde element na de overgang).

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

De bovenliggende Activity ontvangt de callbacks en zorgt voor de vervanging van de fragmenten.

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

Niet te vergeten - de Transition zelf. In dit voorbeeld wordt het gedeelde element verplaatst en geschaald.

@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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow