@@@@@@@@@@@@@@@@@@@@@@@@@@@
DÜZENLEME: Sahip olduğu başka sorunlar olduğu için bu çözümü uygulamadan bıraktım. Square, kısa süre önce parçaların yerini alan 2 kitaplıkla çıktı. Bunun aslında Google'ın yapmalarını istemediği bir şeyi yapmak için parçaları kırmaya çalışmaktan daha iyi bir alternatif olabileceğini söyleyebilirim.
http://corner.squareup.com/2014/01/mortar-and-flow.html
@@@@@@@@@@@@@@@@@@@@@@@@@@@
Gelecekte bu sorunu yaşayan insanlara yardım etmek için bu çözümü ortaya koyacağımı düşündüm. Başkalarıyla yapılan orijinal poster sohbetlerinin izini sürer ve gönderdiği koda bakarsanız, orijinal posterin sonunda ana parçayı canlandırırken alt parçalarda işlemsiz bir animasyon kullanma sonucuna vardığını görürsünüz. Bu çözüm, sizi FragmentPagerAdapter ile bir ViewPager kullanırken külfetli olabilecek tüm alt parçaların kaydını tutmaya zorladığından ideal değildir.
Her yerde Alt Parçalar kullandığım için verimli ve modüler (yani kolayca çıkarılabilen) bu çözümü buldum ve düzeltmeleri durumunda ve bu işlemsiz animasyona artık ihtiyaç kalmadı.
Bunu gerçekleştirmenin birçok yolu var. Bir singleton kullanmayı seçtim ve ona ChildFragmentAnimationManager diyorum. Temel olarak benim için ebeveynine bağlı olarak bir çocuk parçasını takip edecek ve istendiğinde çocuklara işlemsiz bir animasyon uygulayacak.
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;
}
}
Daha sonra, Parçayı genişleten bir sınıfa sahip olmanız gerekir (en azından Alt Parçalarınız). Bu sınıfa zaten sahiptim ve ona BaseFragment diyorum. Bir parça görünümü oluşturulduğunda, onu ChildFragmentAnimationManager'a ekleriz ve yok edildiğinde kaldırırız. Bunu, Eklenti / Ayırma veya dizideki diğer eşleştirme yöntemlerinde yapabilirsiniz. Görünüm Oluşturma / Yok Etme'yi seçme mantığım, bir Parçanın Görünümü yoksa, görülmeye devam etmesi için onu canlandırmayı umursamıyorum. Bu yaklaşım, Fragment kullanan ViewPager'larla da daha iyi çalışmalıdır çünkü bir FragmentPagerAdapter'ın tuttuğu her bir Fragmanı takip etmeyeceksiniz, sadece 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();
}
}
Artık tüm Parçalarınız ana parça tarafından bellekte saklandığına göre, onlara bu şekilde canlandırma diyebilirsiniz ve alt parçalarınız kaybolmaz.
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();
Ayrıca, elinizde olması için, res / anim klasörünüze giden no_anim.xml dosyası:
<?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>
Yine, bu çözümün mükemmel olduğunu düşünmüyorum, ancak her bir çocuğu takip etmek için ana parçada özel kod uygulayan bir Çocuk Parçasına sahip olduğunuz her durumdan çok daha iyidir. Ben oradaydım ve bu hiç eğlenceli değil.
R.id.fragmentHolder
vs A, A1, A2, göre?