我创建了一个应用程序,其中主要片段包含带有recyclerView的片段的viewPager。 recyclerView的每个项目都有一个需要与动画共享到详细片段的图像。 问题是它不起作用。 我尝试过不使用viewPager,只使用一个带有recyclerView的片段,它运行良好。 那么,在viewPager中实现共享元素转换和没有这个的区别在哪里?
在适配器中,我设置了transitionName。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
holder.movieImage.setTransitionName("transition" + position);
}
在Activity中展示详细信息的片段:
public void showFragmentWithTransition(Fragment current, Fragment newFragment, String tag, View sharedView, String sharedElementName) {
FragmentManager fragmentManager = getSupportFragmentManager();
// check if the fragment is in back stack
boolean fragmentPopped = fragmentManager.popBackStackImmediate(tag, 0);
if (fragmentPopped) {
// fragment is pop from backStack
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
current.setSharedElementReturnTransition(TransitionInflater.from(this).inflateTransition(R.transition.default_transition));
current.setExitTransition(TransitionInflater.from(this).inflateTransition(android.R.transition.no_transition));
newFragment.setSharedElementEnterTransition(TransitionInflater.from(this).inflateTransition(R.transition.default_transition));
newFragment.setEnterTransition(TransitionInflater.from(this).inflateTransition(android.R.transition.no_transition));
}
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, newFragment, tag);
fragmentTransaction.addToBackStack(tag);
fragmentTransaction.addSharedElement(sharedView, sharedElementName);
fragmentTransaction.commit();
}
}
在详细的片段中,我会以这样的方式获取参数:
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Bundle arguments = getArguments();
if (arguments != null) {
String transitionName = arguments.getString("transitionName");
Movie movie = (Movie) arguments.getSerializable("movie");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
movieImage.setTransitionName(transitionName);
}
if (movie != null) {
if (!TextUtils.isEmpty(movie.getImage()))
Picasso.with(getActivity()).load("https://i.ytimg.com/vi/qh7LLydY8eo/maxresdefault.jpg").into(movieImage);
else
movieImage.setImageDrawable(null);
}
}
}