или выше, так как они исправили переходы в этой версии.
лизую приложение галереи, которое имеет фрагмент, который содержит RecyclerView с изображениями, и по щелчку изображения я перехожу в ViewPager для циклического перемещения по изображениям.
Сейчас я пытаюсь реализовать только анимацию входа, как вэто видео. Проблема в том, что анимация просто не работает, я явно что-то упускаю (просто показываю код, который имеет отношение к переходам):
ViewPager:
public class ViewPagerFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_viewpager, container, false);
Transition transition = TransitionInflater.from(getContext()).inflateTransition(R.transition.fragment_transition);
setSharedElementEnterTransition(transition);
postponeEnterTransition();
return view;
}
GridAdapter:
public class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> {
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.setPhotoImage(new File(mArrayOfPhotos.get(position).photo));
ViewCompat.setTransitionName(holder.photoImage, mPhotoObjects.get(position).photo);
}
@Override
public void onClick(View view) {
// pass an image view that is being clicked...
// ...via listener to MainActivity from where ViewPagerFragment is started
mListener.onImageSelected(photoImage, getAdapterPosition());
}
}
В MainActivity я создаю экземпляр ViewPagerFragment в onClick:
@Override
public void onImageSelected(View view, int clickedImagePosition) {
ViewPagerFragment fragment = new ViewPagerFragment();
Bundle bundle = new Bundle();
bundle.putInt(ViewPagerFragment.KEY_IMAGE_INDEX, clickedImagePosition);
fragment.setArguments(bundle);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// view is an image view that was clicked
fragmentTransaction.addSharedElement(view, ViewCompat.getTransitionName(view));
fragmentTransaction.setReorderingAllowed(true);
fragmentTransaction.replace(R.id.fragment_placeholder, fragment, VIEWPAGER_FRAGMENT);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
И, наконец, в ImageFragment (который является одним изображением в ViewPager) у меня есть:
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mFullImage.setTransitionName(transitionName);
Glide.with(getActivity())
.load(myImage)
.apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL))
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
getParentFragment().startPostponedEnterTransition();
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
getParentFragment().startPostponedEnterTransition();
return false;
}
})
.into(mFullImage);
return view;
}
Имя перехода не является проблемой, оно уникально и обычно передается между всеми фрагментами. Я следовалэто статью и прочитал много других, но такое ощущение, что немного не хватает в моем коде.
РЕДАКТИРОВАТЬ:
Я смог локализовать проблему, я думаю. Переход работал несколько раз случайным образом, по-видимому, это происходит потому, что изображения не готовы, когда я делаю переход. Я пытался позвонитьpostponeEnterTransition()
в MainActivityonCreate
но все еще не работает. Изображения передаются вImageFragment
через расслоение. Все еще смотрящий.
РЕДАКТИРОВАТЬ:
Я считаю, что я нашел проблему, у меня есть фрагмент, который имеетTabLayout
внутри него, который имеет 2 фрагмента, один из которых отображает все фотографии, а другой - фотографии, помеченные как избранные. И они оба используют одно и то жеRecyclerView
, Переход к общему элементу работает только в том случае, если фотография находится в одном разделе одновременно, после того, как я отмечу фотографию как избранную, она появляется на всех фотографиях, а также в избранных фотографиях, и переход больше не работает. Вероятно, это происходит потому, что переход уже не уникален. Есть ли способ решить это? Учитывая тот факт, что оба фрагмента используют один и тот жеRecyclerView
и тот же класс адаптера.