@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
编辑:我最终没有实现此解决方案,因为这还有其他问题。Square最近推出了2个可替换片段的库。我想说,这实际上可能比尝试破解片段做Google不想让他们做的更好的选择。
http://corner.squareup.com/2014/01/mortar-and-flow.html
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
我想我会提出此解决方案来帮助将来有此问题的人。如果您跟踪与其他人的原始海报发布者对话,并查看他发布的代码,您将看到原始海报最终得出结论,即在对子片段进行动画处理的同时对子片段使用无操作动画。该解决方案并不理想,因为它会迫使您跟踪所有子片段,这在将ViewPager与FragmentPagerAdapter一起使用时会很麻烦。
由于我在所有地方都使用Child Fragments,因此我想出了一种高效,模块化的解决方案(因此可以轻松删除),以防他们修复它,并且不再需要这种无操作动画。
有很多方法可以实现此目的。我选择使用单例,并将其命名为ChildFragmentAnimationManager。基本上,它将根据其父项为我跟踪子项片段,并在询问时对子项应用无操作动画。
public class ChildFragmentAnimationManager {
private static ChildFragmentAnimationManager instance = null;
private Map<Fragment, List<Fragment>> fragmentMap;
private ChildFragmentAnimationManager() {
fragmentMap = new HashMap<Fragment, List<Fragment>>();
}
public static ChildFragmentAnimationManager instance() {
if (instance == null) {
instance = new ChildFragmentAnimationManager();
}
return instance;
}
public FragmentTransaction animate(FragmentTransaction ft, Fragment parent) {
List<Fragment> children = getChildren(parent);
ft.setCustomAnimations(R.anim.no_anim, R.anim.no_anim, R.anim.no_anim, R.anim.no_anim);
for (Fragment child : children) {
ft.remove(child);
}
return ft;
}
public void putChild(Fragment parent, Fragment child) {
List<Fragment> children = getChildren(parent);
children.add(child);
}
public void removeChild(Fragment parent, Fragment child) {
List<Fragment> children = getChildren(parent);
children.remove(child);
}
private List<Fragment> getChildren(Fragment parent) {
List<Fragment> children;
if ( fragmentMap.containsKey(parent) ) {
children = fragmentMap.get(parent);
} else {
children = new ArrayList<Fragment>(3);
fragmentMap.put(parent, children);
}
return children;
}
}
接下来,您需要一个扩展Fragment的类,所有Fragment都应扩展(至少是Child Fragments)。我已经有这个课,我称之为BaseFragment。创建片段视图后,我们将其添加到ChildFragmentAnimationManager中,并在销毁它时将其删除。您可以按顺序执行onAttach / Detach或其他匹配方法。我选择创建/销毁视图的逻辑是因为,如果片段没有视图,则我不希望对其进行动画处理以使其继续可见。这种方法还应该与使用Fragments的ViewPagers更好地配合,因为您将不会跟踪FragmentPagerAdapter持有的每个Fragment,而只能跟踪3。
public abstract class BaseFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Fragment parent = getParentFragment();
if (parent != null) {
ChildFragmentAnimationManager.instance().putChild(parent, this);
}
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onDestroyView() {
Fragment parent = getParentFragment();
if (parent != null) {
ChildFragmentAnimationManager.instance().removeChild(parent, this);
}
super.onDestroyView();
}
}
现在,所有片段都由父片段存储在内存中,您可以像这样对它们调用动画,而子片段不会消失。
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ChildFragmentAnimationManager.instance().animate(ft, ReaderFragment.this)
.setCustomAnimations(R.anim.up_in, R.anim.up_out, R.anim.down_in, R.anim.down_out)
.replace(R.id.container, f)
.addToBackStack(null)
.commit();
另外,就这样,这是位于res / anim文件夹中的no_anim.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/linear_interpolator">
<translate android:fromXDelta="0" android:toXDelta="0"
android:duration="1000" />
</set>
再说一次,我认为这种解决方案不是完美的,但是它比每个实例都有一个子片段要好得多,它在父片段中实现自定义代码以跟踪每个孩子。我去过那里,这很无聊。
R.id.fragmentHolder
相对于A,A1,A2,等等?