Обратное изображение Переход от одного действия к другому не работает
Я делаю приложение, в котором часть его функциональных возможностей заключается в отображении изображений из галереи изображений в окне просмотра, которое может пролистывать все изображения. Я использую непрерывный переход общих элементов для изображений, если я нажимаю на изображение и не проводите пальцем влево или вправо, он правильно переходит к предыдущему действию, когда я нажимаю кнопку "Назад", но если я провожу изображение вправо и нажимаю кнопку "Назад", он возвращается в правильное положение, но с изображением после него, если я проведу пальцем влево, он вернется в правильное положение, но с изображением перед ним.
Примечание: я использую скольжение для загрузки изображений. Переход происходит от активности к действию, а не от фрагмента к фрагменту, что, как я считаю, является проблемой, я пытался воспроизвести пример из документации Android, но с действиями, а не фрагментами. В моем sharedelementscallback в действии ShowImage отсутствуют некоторые строки кода потому что я не знаю, какие методы вызывать, похожие на те, что указаны в документации.
Я использую viewpager, а не viewpager2, поскольку он все еще глючит.
AllPicturesView Activity показывает все изображения, а ShowImage Activity показывает отдельные
изображения в окне просмотра при нажатии на изображение.ShowImageViewPagerAdapter - это адаптер
ShowImage, который реализует перелистывание страниц просмотра.
Действие AllPicturesView, показывающее sharedEmentCallback
public void setMyExitSharedElementCallback() {
setExitSharedElementCallback(
new SharedElementCallback() {
@Override
public void onMapSharedElements(
final List<String> names, final Map<String, View> sharedElements) {
// Locate the ViewHolder for the clicked position.
final FastScrollRecyclerView.ViewHolder selectedViewHolder = fastScrollRecyclerView
.findViewHolderForAdapterPosition(PictureFolderManager.position);
if (selectedViewHolder == null || selectedViewHolder.itemView == null) {
return;
}
// Map the first shared element name to the child ImageView.
sharedElements.put(names.get(0),
selectedViewHolder.itemView.findViewById(R.id.profile_image2));
};
});}
ShowImageViewAdapter
public ShowImageViewPagerAdapter(Context context, List<String> images, Integer pos) {
this.context = context;
this.images = images;
this.pos=pos;
options = new RequestOptions()
.placeholder(R.color.black)
.error(R.color.black)
.dontTransform()
.skipMemoryCache(true)
//.priority(Priority.IMMEDIATE)
.diskCacheStrategy(DiskCacheStrategy.NONE);
}
@Override
public int getCount() {
return images.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
// view=view.
return view==object;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View)object);//removes the root layout in custom layout
}
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
layoutInflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
itemView=layoutInflater.inflate(R.layout.viewpagerlayout,container,false);
photoView =itemView.findViewById(R.id.photoView);
photoView.setTransitionName(images.get(PictureFolderManager.position));
Glide.with(container).load(images.get(position)).listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
((Activity) context).startPostponedEnterTransition();
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
((Activity) context).startPostponedEnterTransition();
return false;
}
}).into(photoView);
//photoView.setImageURI(Uri.parse(images.get(position)));
container.addView(itemView);
return itemView;
}
/*
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.viewpagerlayout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.photoView.setTransitionName(images.get(position));
//photoView.setImageURI(Uri.parse(images.get(position)));
Toast.makeText(context,String.valueOf(position),Toast.LENGTH_SHORT).show();
Glide.with((Activity)context).load(images.get(position)).listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
((Activity) context).startPostponedEnterTransition();
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
((Activity) context).startPostponedEnterTransition();
return false;
}
}).into(holder.photoView);
}
@Override
public int getItemCount() {
return images.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
PhotoView photoView;
public ViewHolder(View itemView){
super(itemView);
photoView =itemView.findViewById(R.id.photoView);
}
}*/
}## ShowImage Activity, показывающее sharedElementCallback ##
public void setMyEnterSharedElementCallback() {
setEnterSharedElementCallback(
new SharedElementCallback() {
@Override
public void onMapSharedElements(
final List<String> names, final Map<String, View> sharedElements) {
// Locate the image view that is currently visible). To locate call instantiateItem with the selection position.
// Map the first shared element name to the child ImageView.
sharedElements.put(names.get(0), findViewById(R.id.photoView));
}
});
}