此bounty已结束。此问题的答案可获得+150声望奖励。奖励宽限期将在11小时后结束。shybaka正在寻找规范答案。
共享元素转换替换了片段,所以我无法将其添加到backstack并在按下返回箭头按钮时调用popbackstack。我有一个主片段内的主Activity,主片段处理一个表格布局,因此每个选项卡都是一个回收器视图内的片段,当单击回收器视图元素时,共享元素转换开始到一个显示元素细节的新片段。
这是在其中单击元素的适配器:
holder.image.setTransitionName("transition" + holder.getAdapterPosition());
if (fragment instanceof tab1_anime) {
((tab1_anime) fragment).openShowElementFragment(holder.getAdapterPosition(), v.findViewById(R.id.main_image));
}
这是我的标签片段中的openShowElementFragment:
public void openShowElementFragment(int position, View view) {
AddElement element = anime_list.get(position);
ShowElementFragment showElementFragment = new ShowElementFragment();
Bundle bundle = new Bundle();
bundle.putString("transitionName", "transition" + position);
bundle.putSerializable("element", element);
bundle.putInt("position", position);
bundle.putInt("from", 0);
showElementFragment.setArguments(bundle);
((MainActivity) context).showFragmentWithTransition(this, showElementFragment, "showElementFragment", view, "transition" + position);
}
这是在前面的代码块中调用的openshowelementfragment函数:
public void showFragmentWithTransition(Fragment current, Fragment newFragment, String tag, View sharedView, String sharedElementName) {
FragmentManager fragmentManager = getSupportFragmentManager();
// check if the fragment is in back stack
boolean fragmentPopped = fragmentManager.popBackStackImmediate(tag, 0);
if (fragmentPopped) {
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
current.setSharedElementReturnTransition(TransitionInflater.from(this).inflateTransition(R.transition.default_transition));
current.setExitTransition(TransitionInflater.from(this).inflateTransition(R.transition.default_transition));
newFragment.setSharedElementEnterTransition(TransitionInflater.from(this).inflateTransition(R.transition.default_transition));
newFragment.setEnterTransition(TransitionInflater.from(this).inflateTransition(R.transition.default_transition));
}
fragmentManager.beginTransaction()
.replace(R.id.fragmentHolder, newFragment)
.addToBackStack(null)
.addSharedElement(sharedView, sharedElementName)
.commit();
}
}
这是后退键
back_arrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getSupportFragmentManager().popBackStack();
}
});
如果我尝试添加新片段而不是替换旧片段,则根本没有动画。
如果我尝试用新片段替换旧片段,并使用addtobackstack(null),那么共享元素转换将从开始到结束工作,但最后的片段没有数据,为空:
我也试过:
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragmentHolder, new MainFragment())
.addToBackStack(null)
.commit();
但是这样共享元素的转换在退出时不起作用:
2条答案
按热度按时间t0ybt7op1#
我认为你的问题是与退出过渡有关,因为你得到了空列表的解决方案,现在退出过渡效果检查下面的代码。
在这里,我为退出过渡添加两个新行。
如果它不工作,然后按照下面的链接,我想它会帮助你。https://medium.com/@bherbst/fragment-transitions-with-shared-elements-7c7d71d31cbb
mwecs4sa2#
你所谓的
sharedElementName
实际上是一个transitionName
。a)参考示例不直接操作反栈:
是的。
B)手动事务可能需要另一种方法调用顺序:
另请参阅example,了解如何设置交替跃迁,并与以下各项进行比较:
不管
R.transition.default_transition
是什么。当两种方式使用相同的转换而不是进入/退出转换时,可能会看起来很奇怪,就像
NavAction
将具有的功能一样。FragmentNavigator.Extras
可用于在使用导航组件时应用进入/退出转换;这也可以与ActionBar
结合。选项a)可能不那么复杂。b)类似this的Kotlin示例可能更有意义。当out-of-the-box支持进入/退出过渡时,构建笨重的导航FX是毫无意义的。加载图像时,可以考虑使用Glide加载。假设如下
build.gradle
;没必要重新发明轮子。那么
Navigation
加上FragmentNavigator.Extras
可能是当前的方法:也可以在XML
<action/>
节点中定义transitionName。