2016-09-02 18 views
18

आईओएस में मैं स्टोरीबोर्ड को हटाने और कार्टोग्राफी ढांचे का उपयोग कोड में सबकुछ रखने के लिए एक बड़ा प्रशंसक हूं। यह नक्शानवीसी के GitHub से चोरी हो गया है:एंड्रॉइड बाधा लेआउट प्रोग्रामेटिक रूप से?

constrain(view1, view2) { view1, view2 in 
    view1.width == (view1.superview!.width - 50) * 0.5 
    view2.width == view1.width - 50 
    view1.height == 40 
    view2.height == view1.height 
    view1.centerX == view1.superview!.centerX 
    view2.centerX == view1.centerX 

    view1.top >= view1.superview!.top + 20 
    view2.top == view1.bottom + 20 
} 

वहाँ किसी भी बराबर बिल्कुल है Android के लिए? ऐसा लगता है कि नया प्रतिबंध लेआउट सही दिशा में एक कदम है लेकिन मैं इसे प्रोग्रामेटिक रूप से करना चाहता हूं।

+0

क्यों आप यह कर नहीं होगा एक्सएमएल का उपयोग कर? – Zoe

+4

लोग इस प्रोग्रामेटिक रूप से ऐसा क्यों करना चाहते हैं, उदाहरण के लिए, लोग ऐसे ऐप्स के अलावा पुस्तकालयों का विकास कर रहे हैं जिनके पास प्री-डिफ़ाइंड यूई है, या लोगों को रनटाइम पर उपयोगकर्ता इंटरैक्शन से प्रभावित लेआउट विनिर्देशों और यहां तक ​​कि और भी कारणों को बदलने की आवश्यकता है। .. Google को वास्तव में इस नई सुविधा – yongsunCN

+2

पर दस्तावेज़ों की कमी है, एक अन्य (सरल) कारण, @ Polarbear0106 यह है कि यदि आपको TransitionManager और विशेष रूप से 'TransitionManager.beginDelayedTransition (root) का उपयोग करने की आवश्यकता है, तो फिर आप अपने लेआउट परिवर्तन मैन्युअल रूप से निर्दिष्ट करने के लिए _need_ वे अगले पास में गाया जाता है। तो, हाँ, ऐसे समय होते हैं जब आपको प्रोग्राम को सामग्री को संशोधित करने की आवश्यकता होती है। –

उत्तर

34

खेल के लिए थोड़ा देर हो चुकी है, लेकिन आपको मूल रूप से अपने विचारों को एक बाधा लेआउट में नियमित रूप से देखना चाहिए क्योंकि नियमित रूप से उनके स्वयं के लेआउटपैम हैं।

ConstraintLayout मामले में, प्रलेखन यहाँ स्थित है: https://developer.android.com/reference/android/support/constraint/ConstraintLayout.LayoutParams.html

इस वर्ग को निर्दिष्ट किसी दृश्य का एक ConstraintLayout अंदर बाहर रखी होना चाहते हैं अलग-अलग विशेषताओं में शामिल है। रनटाइमसेट का उपयोग करके रनटाइम पर बाधाओं का निर्माण करने की सिफारिश की जाती है।

तो, की सिफारिश की विधि एक ConstraintSet उपयोग करने के लिए है।

वहाँ वहाँ एक अच्छा कोड नमूना है, लेकिन मूल अवधारणा आप (कॉपी/क्लोनिंग/नई आदि द्वारा) एक नया सेट बनाने की जरूरत है, उसके गुण निर्धारित करते हैं, और उसके बाद अपने लेआउट में इसे लागू।

उदाहरण के लिए: मान लीजिए कि आपके लेआउट एक ConstraintLayout (यहाँ mConstraintLayout कहा जाता है) होता है और अंदर यह एक दृश्य (नमूने में R.id.go_button) शामिल हैं, तुम कर सकते हो:

ConstraintSet set = new ConstraintSet(); 

    // You may want (optional) to start with the existing constraint, 
    // so uncomment this. 
    // set.clone(mConstraintLayout); 

    // Resize to 100dp 
    set.constrainHeight(R.id.go_button, (int)(100 * density)); 
    set.constrainWidth(R.id.go_button, (int)(100 * density)); 

    // center horizontally in the container 
    set.centerHorizontally(R.id.go_button, R.id.rootLayout); 

    // pin to the bottom of the container 
    set.connect(R.id.go_button, BOTTOM, R.id.rootLayout, BOTTOM, 8); 

    // Apply the changes 
    set.applyTo(mConstraintLayout); 
    // this is my… (ConstraintLayout) findViewById(R.id.rootLayout); 
+5

मेरे मामले में, यह –

+0

जोड़ने से पहले set.clone (mConstraintLayout) वर्तमान बाधाओं कॉपी करने के लिए जोड़ आप एक झाड़ू सिर @Martin Marconcini पहने हुए हैं जरूरी हो गया था? –

+1

@ टॉमहोर्ड मैं हिम्मत नहीं करूंगा! ;) (यदि आप उत्सुक हैं, http://www.thinkgeek.com/product/f0d0/) यदि लिंक भविष्य में विफल रहता है, तो Google "बौना दाढ़ी हैट" (मैं इसे @ सोच गीक लाया) 5 साल की तरह पहले। –

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