我正在尝试实现具有"共享元素"的片段之间的转换,如新材料设计规范中所述.我能找到的唯一方法是ActivityOptionsCompat.makeSceneTransitionAnimation,我认为它仅适用于Activity.我一直在寻找相同的功能,但有/片段.
在主要活动中,我有BottomNavigationView3 个不同的父片段。父片段具有recyclerview并在 recyclerview 的项目单击时,我正在启动子片段以获取有关该项目的更多详细信息。我试图Shared Element Transition在我的两个片段(父和子)之间实现,但它没有发生。
启动子片段没有问题,我也检查了转换名称,它与我分配给适配器中的项目的子片段相同。我正在使用Random类将转换名称分配给项目,因为在单父片段中我有很多 recyclerviews。这是我的代码:
适配器
final String transition;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
transition = "transition" + new Random().nextInt(9999999);
viewHolder.image.setTransitionName(transition);
}
viewHolder.container.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCallback.itemClicked(i, book, viewHolder.image, transition);
}
});
Run Code Online (Sandbox Code Playgroud)
父片段
@Override
public void itemClicked(int pos, Book book, View view, String transition) {
MainActivity activity = (MainActivity) getActivity();
ChildFragment myFragment = new ChildFragment();
Bundle bundle = new Bundle();
bundle.putString(IntentExtraKeys.TRANSITION_NAME, transition);
myFragment.setArguments(bundle);
activity.showFragmentWithTransition(this, …Run Code Online (Sandbox Code Playgroud) 当我尝试使用Medium GitHub 上这篇文章中的类似代码对片段使用转换时。当我在片段管理器上使用 add method() 时它不起作用,但它可以与 replace() 一起使用。
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.addSharedElement(mSharedElement, "transName")
.add(D.id.content_frame, fragment, FRAG_NAME)
.addToBackStack(null)
.commit();
Run Code Online (Sandbox Code Playgroud)
我需要使用 add() 方法来保留下面的片段,因为用户将在包含项目列表的第一个片段和显示有关该项目的详细信息的第二个片段之间来回导航。我不想继续用列表加载片段。
在片段管理器上使用 add() 时,有没有办法让共享元素转换工作,而不是 replace()。
android android-fragments fragmentmanager android-transitions shared-element-transition