Переход SharedElement, оставляющий белое изображение по возвращении (используя Navigation) - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть RecyclerView (содержится в ViewPager), содержащий изображения, и я хотел бы отображать их в полноэкранном режиме с переходом общего элемента, когда пользователь нажимает на него. Я успешно реализовал переход общего элемента между моими двумя фрагментами, но когда я нажимаю на кнопку возврата, ImageView, где я щелкнул, имеет белый цвет.

В моем методе onBindViewHolder у меня есть:

 holder.picturePost.setOnClickListener(v -> {
                NavDirections action = ProfileFragmentDirections.viewPostDetails(post);
                v.setTransitionName(post);
                FragmentNavigator.Extras extras = new FragmentNavigator.Extras.Builder().addSharedElement(v, post).build();
                Navigation.findNavController(v).navigate(action, extras);
            });

Мое назначение фрагмент является OpenPostFragment:

public class OpenPostFragment extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        postponeEnterTransition();
        setSharedElementEnterTransition(TransitionInflater.from(getContext()).inflateTransition(android.R.transition.move));
        setSharedElementReturnTransition(TransitionInflater.from(getContext()).inflateTransition(android.R.transition.move));
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.post_card_fragment, container, false);
        Bundle args = getArguments();
        if (args != null) {
            ImageView picturePost = root.findViewById(R.id.picturePost);
            String imagePath = args.getString("imagePath");
            picturePost.setTransitionName(imagePath);
            Glide.with(picturePost)
                    .load(imagePath)
                    .dontTransform()
                    .listener(new RequestListener<Drawable>() {
                        @Override
                        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                            startPostponedEnterTransition();
                            return false;
                        }

                        @Override
                        public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                            startPostponedEnterTransition();
                            return false;
                        }
                    })
                    .into(picturePost);
        }
        return root;
    }
}

1 Ответ

0 голосов
/ 23 февраля 2020

Я наконец решил свою проблему. Тот факт, что мой RecyclerView был в ViewPager, вызывал проблемы. Чтобы решить мою проблему, я должен был добавить следующий код к фрагменту, где я инициализирую свой ViewPager:

postponeEnterTransition();
ViewTreeObserver.OnPreDrawListener onPreDrawListener = new ViewTreeObserver.OnPreDrawListener() {
     @Override
     public boolean onPreDraw() {
           mPager.getViewTreeObserver().removeOnPreDrawListener(this);
           startPostponedEnterTransition();
           return true;
     }
};
mPager.getViewTreeObserver().addOnPreDrawListener(onPreDrawListener);
...