@@@@@@@@@@@@@@@@@@@@@@@@@@@@
संपादित करें: मैंने इस समाधान को लागू करने को समाप्त कर दिया क्योंकि इसमें अन्य समस्याएं थीं। स्क्वायर हाल ही में 2 पुस्तकालयों के साथ निकला है जो टुकड़ों को प्रतिस्थापित करते हैं। मैं कहूंगा कि यह वास्तव में टुकड़ों को हैक करने की कोशिश करने से बेहतर विकल्प हो सकता है कि कुछ ऐसा नहीं करना चाहिए जो उन्हें करना है।
http://corner.squareup.com/2014/01/mortar-and-flow.html
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
मुझे लगा कि मैं भविष्य में इस समस्या से जूझ रहे लोगों की मदद करने के लिए यह उपाय करूंगा। यदि आप अन्य लोगों के साथ मूल पोस्टर वार्तालाप के माध्यम से ट्रेस करते हैं, और जिस कोड को उन्होंने पोस्ट किया है, उसे देखते हैं, तो आप मूल पोस्टर को देखेंगे, जो मूल अंश को एनिमेट करते हुए बच्चे के टुकड़े पर नो-ऑप एनीमेशन का उपयोग करने के निष्कर्ष पर पहुंचता है। यह समाधान आदर्श नहीं है क्योंकि यह आपको सभी बच्चे के टुकड़ों पर नज़र रखने के लिए मजबूर करता है, जो कि FragmentPagerAdapter के साथ एक ViewPager का उपयोग करते समय बोझिल हो सकता है।
चूँकि मैं बाल समाधान का उपयोग सभी जगह पर करता हूं, जो इस समाधान के साथ आया है जो कुशल है, और मॉड्यूलर (इसलिए इसे आसानी से हटाया जा सकता है) यदि वे कभी इसे ठीक करते हैं और इस नो-ऑप एनीमेशन की अब आवश्यकता नहीं है।
इसे लागू करने के कई तरीके हैं। मैंने एक सिंगलटन का उपयोग करने के लिए चुना है, और मैं इसे चाइल्डफ्रैगमेंटएनीमेशन मैनजर कहता हूं। यह मूल रूप से अपने माता-पिता के आधार पर मेरे लिए एक बच्चे के टुकड़े का ट्रैक रखेगा और पूछे जाने पर बच्चों को नो-ऑप एनीमेशन लागू करेगा।
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;
}
}
आगे आपको एक ऐसा वर्ग रखना होगा जो आपके सभी अंशों का विस्तार करता हो (कम से कम आपके बच्चे के टुकड़े) का विस्तार करता है। मेरे पास पहले से ही यह वर्ग था, और मैं इसे बेसफ्रैगमेंट कहता हूं। जब एक खंड दृश्य बनाया जाता है, तो हम इसे चाइल्डफ्रैगमेंटएनीमेशन मैनजर में जोड़ते हैं, और इसे नष्ट होने पर हटा देते हैं। आप इसे onAttach / Detach, या अन्य मिलान विधियों को अनुक्रम में कर सकते हैं। क्रिएट / डिस्टर्ब व्यू को चुनने का मेरा तर्क यह था क्योंकि अगर किसी फ्रैगमेंट में व्यू नहीं है, तो मैं इसे जारी रखने के लिए इसे एनिमेट करने की परवाह नहीं करता। इस दृष्टिकोण को ViewPagers के साथ भी बेहतर काम करना चाहिए जो Fragments का उपयोग करते हैं क्योंकि आप हर एक Fragment का ट्रैक नहीं रखेंगे जो कि FragmentPagerAdapter को पकड़े हुए है, लेकिन केवल 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();
इसके अलावा, बस आपके पास यह है, यहाँ 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
ए, ए 1, ए 2, आदि के संबंध में क्या है ?