我有以下设置:一个MainActivity,一个AFragment,它有一个RecyclerView和一个BFragment,用于包含AFragment中元素的细节。当用户点击AFragment中的项目时,它会将它们带到BFragment。
我想要创建的效果是为AFragment中的项目获取ImageView并将其转换为BFragment。
问题是,目前,对于RecyclerView“第一页”上的所有项目(“第一页”我指的是您在第一次进入AFragment时可以在屏幕上看到的所有项目),进入过渡到BFragment根本不起作用。但是当从BFragment返回到AFragment时,转换正常。对于RecyclerView中的所有其他项目(即不在“第一页”上的项目),进入和退出过渡都可以完美地进行。
AFragment
public class AFragment extends Fragment {
...
public static class ItemAdapter extends RecyclerView.Adapter<ViewHolder> {
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final Item info = items.get(position);
ViewCompat.setTransitionName(holder.imageView, "shared_image_" + info.getId());
holder.imageView.setImageDrawable(info.getIcon());
holder.name.setText(info.getName());
holder.rootView.setTag(info.getId());
holder.rootView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
BFragment frag = BFragment.newInstance((Integer) v.getTag());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
frag.setSharedElementEnterTransition(new ComboTransition());
frag.setEnterTransition(new Fade());
setExitTransition(new Fade());
frag.setSharedElementReturnTransition(new ComboTransition());
Log.d(TAG, "Name: " + imageView.getTransitionName());
}
getFragmentManager().beginTransaction()
.addSharedElement(imageView, "shared_image")
.replace(R.id.content, frag)
.addToBackStack(null)
.commit();
}
});
}
}
...
}
BFragment
public class BFragment extends Fragment {
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
...
ImageView imageView = (ImageView) findViewById(R.id.image_view);
ViewCompat.setTransitionName(imageView, "shared_image");
...
}
...
}
答案 0 :(得分:1)
URG。我发现了问题,这是我的应用程序独有的。问题是我忘了我在BFragment中有另一个RecyclerView副本(原因是我希望用户能够在BFragment中搜索AFragment中的所有项目,因此UX更好一些)。所以发生的事情是,当用户退出AFragment并进入BFragment时,BFragment中的recyclelerview将被初始化,因此“第一页”上的所有项目也会被初始化,其具有与AFragment中的项目相同的转换名称(因此奇怪的行为)与“第一页”上的项目。当然这非常糟糕,因为现在两个项目具有相同的转换名称。
我通过更改ItemAdapter的构造函数来解决问题,以获取创建者唯一的密钥,并将此密钥添加到所有转换名称前面。