8

जब v24.0.0 के लिए Android समर्थन लाइब्रेरी v23.4.0 से उन्नयन, प्रोग्राम के रूप में एक AppBarLayout 0 करने के लिए ऊँचाई निर्धारित करके बंद कर दिया काम कर रहे:एंड्रॉइड सपोर्ट लाइब्रेरी v24.0.0 में प्रोग्रामेटिक रूप से ऐपबारलाउट की ऊंचाई कैसे सेट करें?

appBayLayout.setElevation(0); 

यह जब एक्सएमएल में ऊँचाई निर्धारित करके काम करता है।

उत्तर

10

संपादित

AppBarLayout v24.0.0 से एक StateListAnimator कि अपनी स्थिति के आधार पर पदोन्नति को परिभाषित करता है उपयोग करता है। इसलिए setElevation का उपयोग कोई प्रभाव नहीं होगा यदि StateListAnimator का उपयोग किया जा रहा है (जो डिफ़ॉल्ट रूप से होता है)। XML के माध्यम से elevation सेट या प्रोग्राम के रूप में (दोनों एपीआई> = 21 के लिए):

StateListAnimator stateListAnimator = new StateListAnimator(); 
stateListAnimator.addState(new int[0], ObjectAnimator.ofFloat(view, "elevation", 0)); 
appBarLayout.setStateListAnimator(stateListAnimator); 

पुराना जवाब

यह एक issue of the design support library हो रहा है। समस्या setElevation का उपयोग करके, प्रोग्राम को प्रोग्रामेटिक रूप से सेट करने के तरीके से संबंधित है। इसे एक्सएमएल से सेट करना StateListAnimator को दृश्य में रख रहा है और setElevation पर कॉल नहीं कर रहा है। हालांकि, setElevation काम करना चाहिए।

यहाँ वहाँ एक समाधान नहीं है:

setDefaultAppBarLayoutStateListAnimator(appBarLayout, 0); 

@SuppressLint("PrivateResource") 
private static void setDefaultAppBarLayoutStateListAnimator(final View view, final float targetElevation) { 
    final StateListAnimator sla = new StateListAnimator(); 

    // Enabled, collapsible and collapsed == elevated 
    sla.addState(new int[]{android.R.attr.enabled, android.support.design.R.attr.state_collapsible, 
      android.support.design.R.attr.state_collapsed}, 
      ObjectAnimator.ofFloat(view, "elevation", targetElevation)); 

    // Enabled and collapsible, but not collapsed != elevated 
    sla.addState(new int[]{android.R.attr.enabled, android.support.design.R.attr.state_collapsible, 
      -android.support.design.R.attr.state_collapsed}, 
      ObjectAnimator.ofFloat(view, "elevation", 0f)); 

    // Enabled but not collapsible == elevated 
    sla.addState(new int[]{android.R.attr.enabled, -android.support.design.R.attr.state_collapsible}, 
      ObjectAnimator.ofFloat(view, "elevation", targetElevation)); 

    // Default, none elevated state 
    sla.addState(new int[0], ObjectAnimator.ofFloat(view, "elevation", 0)); 

    view.setStateListAnimator(sla); 
} 

यह क्या निर्माता करता है से लिया जाता है वर्ग ViewUtilsLollipop में v24.0.0 में एक विधि बुला।

+0

कौन सा 'अपने उदाहरण' stateListAnimator.addState में view' प्रयोग किया जाता है (नई पूर्णांक [0], ObjectAnimator.ofFloat (देखने के लिए, "ऊंचाई", 0)); '? –

+0

@VolodymyrKhodonovych एक एक पैरामीटर – bryant1410

+1

मैं एंड्रॉयड 21 इस तरह में त्रुटि है के रूप में पारित> JNI DETECTED आवेदन में त्रुटि: शून्य कॉल नहीं कर सकते> android.view.View.setElevation (नाव) अशक्त वस्तु –

3

इसके लिए एक और संभावित समाधान android:stateListAnimator="@null" को अपने AppBarLayout पर नीचे दिखाए गए अनुसार जोड़ना है।

<android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:stateListAnimator="@null" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 
संबंधित मुद्दे