@@@@@@@@@@@@@@@@@@@@@@@@@@@@
편집 : 다른 문제가 있었기 때문에이 솔루션을 구현하지 않았습니다. Square는 최근 조각을 대체하는 2 개의 라이브러리를 출시했습니다. 나는 이것이 구글이 원하지 않는 일을하도록 조각을 해킹하는 것보다 실제로 더 나은 대안이라고 말하고 싶다.
http://corner.squareup.com/2014/01/mortar-and-flow.html
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
나는 미래에이 문제가있는 사람들을 돕기 위해이 해결책을 제시 할 것이라고 생각했습니다. 다른 사람들과의 원래 포스터 대화를 추적하고 그가 게시 한 코드를 보면 원본 포스터가 결국 부모 조각을 애니메이션하는 동안 자식 조각에 작동하지 않는 애니메이션을 사용하는 결론에 도달하는 것을 볼 수 있습니다. 이 솔루션은 FragmentPagerAdapter와 함께 ViewPager를 사용할 때 번거로울 수있는 모든 하위 조각을 추적해야하므로 이상적이지 않습니다.
나는 모든 곳에서 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;
}
}
다음으로 모든 프래그먼트가 확장하는 프래그먼트를 확장하는 클래스가 있어야합니다 (적어도 하위 프래그먼트). 나는 이미이 클래스를 가지고 있었고 그것을 BaseFragment라고 부른다. 프래그먼트 뷰가 생성되면 ChildFragmentAnimationManager에 추가하고 소멸되면 제거합니다. onAttach / Detach 또는 시퀀스의 다른 일치 방법을 수행 할 수 있습니다. Create / Destroy View를 선택하는 논리는 Fragment에 View가없는 경우 계속 표시되도록 애니메이션하는 데 신경 쓰지 않기 때문입니다. 이 접근 방식은 FragmentPagerAdapter가 보유하고있는 모든 단일 Fragment를 추적하지 않고 3 개만 추적하므로 Fragment를 사용하는 ViewPager에서도 더 잘 작동합니다.
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 등과 관련하여 무엇입니까 ?