2013-11-20 11 views
28

मैं की तरह एक नेस्टेड लेआउट निम्नलिखित:animateLayoutChanges नेस्टेड लेआउट के साथ अच्छी तरह से काम नहीं करता है?

<LinearLayout>  <!----Parent layout---> 
    <LinearLayout> <!-----child 1---> 
     ... 
    </LinearLayout> <!----child 1 ended---> 
    <LinearLayout> <!-----child 2---> 
     ... 
    </LinearLayout> <!----child 2 ended---> 
</LinearLayout> <!----Parent endded---> 

समस्या अब मैं कर रहा हूँ कि जब मेरे सभी डेटा आइटम बच्चा 1 या बच्चे 2 Linearlayout भीतर कर रहे हैं, अगर मैं जोड़ सकते हैं या बच्चे LinearLayout एक आइटम को हटाने है AnimateLayoutChanges के प्रभाव से एनिमेटेड होगा लेकिन पैरेंट लेआउट कोई एनीमेशन नहीं करेगा। (मेरे पास android:animateLayoutChanges सभी रैखिक लेआउट के लिए true पर सेट है)। विशेष रूप से जब मैं बच्चे के भीतर कोई आइटम हटाता हूं तो एनीमेशन प्रभाव अजीब हो जाता है (मूल रूप से बच्चा 2 कूद जाएगा जबकि बच्चा 1 अभी भी एनीमेशन कर रहा है)।

क्या किसी को यह पता है कि इसे कैसे हल किया जाए?

धन्यवाद

अद्यतन

कुछ ही समय बाद मैं इस प्रश्न पोस्ट, मैं इस LayoutTransition एपीआई में एंड्रॉयड डेवलपर की साइट पर पाया।

नेस्टेड दृश्य पदानुक्रम के कई स्तरों पर लेआउटट्रांसशन का उपयोग लेआउट के विभिन्न स्तरों के अंतःसंबंध के कारण काम नहीं कर सकता है।

तो क्या किसी के पास इस मुद्दे के लिए सुझावों के आसपास कोई काम है?

उत्तर

63

animateLayoutChanges संपत्ति LayoutTransitions का उपयोग करती है, जो लेआउट के बच्चों और लेआउट पदानुक्रम में पूर्वजों के पेड़ के शीर्ष तक सभी स्तरों पर लेआउट के बच्चों को एनिमेट करते हैं। हनीकॉम में, केवल लेआउट के बच्चे एनिमेटेड होंगे। विवरण के लिए this Android Developers Blog post देखें।

दुर्भाग्य से, ऐसा लगता है कि वर्तमान में लेआउट के भाई बहन LayoutTransitions पर प्रतिक्रिया करने का कोई आसान तरीका नहीं है। लेआउट की सीमाओं को बदलने के दौरान अधिसूचित होने के लिए आप TransitionListener का उपयोग करने का प्रयास कर सकते हैं, और एनीमेटर्स का उपयोग करके भाई के दृश्यों को स्थानांतरित कर सकते हैं। this Google+ post में चेत हास का दूसरा जवाब देखें।

EDIT - एक तरीका है। एंड्रॉइड 4.1+ (एपीआई लेवल 16+) में आप एक लेआउट संक्रमण प्रकार CHANGING का उपयोग कर सकते हैं, जो डिफ़ॉल्ट रूप से अक्षम है। कोड में यह सक्षम करने के लिए:

ViewGroup layout = (ViewGroup) findViewById(R.id.yourLayout); 
LayoutTransition layoutTransition = layout.getLayoutTransition(); 
layoutTransition.enableTransitionType(LayoutTransition.CHANGING); 

तो, अपने उदाहरण में, बच्चे 2 लेआउट एनिमेटेड है, आप इसके लिए CHANGING लेआउट परिवर्तन सक्षम करने की आवश्यकता होगी। उसके माता-पिता की सीमाओं में बदलाव होने पर परिवर्तन लागू किया जाएगा। अधिक जानकारी के लिए

this DevBytes video देखें।

+0

उत्तर के लिए धन्यवाद मैं इसे आज़मा दूंगा। – Chen

+0

मैंने यह कोशिश की और यह वास्तव में मेरी स्थिति में अच्छी तरह से काम नहीं कर रहा है, मुझे लगता है कि सेट करने के लिए सक्षम ट्रांजिशन टाइप टाइप का एक समान प्रभाव है जैसा एनिमेटलाइट चेंज ध्वज सत्य होना है। वैसे भी, मैं एक और दृष्टिकोण में चले गए ताकि एनिमेटेड नेस्टेड लेआउट की आवश्यकता नहीं है। – Chen

+0

हे! @ फिर, क्या आपने अपना मुद्दा हल किया है? – Vijju

1

ऐसा लगता है कि माता-पिता पर देरी से संक्रमण एनिमेटिंग के लिए भी काम करता है। कम से कम मेरे लिए निम्न कोड एक उचित विस्तार/पतन एनीमेशन देता है।

expandTrigger.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     TransitionManager.beginDelayedTransition(parentLayout); 
     expanded = !expanded; 

     child1.setVisibility(expanded ? View.VISIBLE : View.GONE); 
    } 
}); 
गहरा नेस्टेड लेआउट आप कभी कभी एक माता पिता उच्च TransitionManager करने के लिए कॉल में पदानुक्रम में ऊपर का उपयोग करने के लिए आवश्यकता हो सकती है

1

हमने एंड्रॉइड जोड़ा था: animateLayoutChanges हमारे LinearLayout में विशेषता है लेकिन परिवर्तन ने एनीमेशन ट्रिगर नहीं किया है।

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
((ViewGroup) findViewById(R.id.llRoot)).getLayoutTransition() 
     .enableTransitionType(LayoutTransition.CHANGING); 
} 

More details: कि ठीक करने के लिए, इस कोड का उपयोग।

संबंधित मुद्दे