ConstraintLayout
एक ऐसा लेआउट है जिसकी मदद से, स्क्रीन पर मौजूद अन्य कंपोज़ेबल के हिसाब से कंपोज़ेबल को रखा जा सकता है. यह कई नेस्ट किए गए Row
, Column
, Box
, और कस्टम लेआउट के अन्य एलिमेंट इस्तेमाल करने का विकल्प है. ConstraintLayout
ज़्यादा जटिल अलाइनमेंट की ज़रूरतों वाले बड़े लेआउट लागू करने के लिए, इसका इस्तेमाल किया जाता है.
इन स्थितियों में ConstraintLayout
का इस्तेमाल करें:
- स्क्रीन पर एलिमेंट को पोज़िशन करने के लिए, कई
Column
औरRow
नेस्ट करने से बचें, ताकि कोड को आसानी से पढ़ा जा सके. - इस मॉडिफ़ायर का इस्तेमाल, कंपोज़ेबल को अन्य कंपोज़ेबल के हिसाब से पोज़िशन करने या दिशा-निर्देशों, बैरियर या चेन के आधार पर कंपोज़ेबल को पोज़िशन करने के लिए किया जाता है.
व्यू सिस्टम में, बड़े और जटिल लेआउट बनाने के लिए � का इस्तेमाल करने का सुझाव दिया जाता था. ऐसा इसलिए, क्योंकि नेस्ट किए गए व्यू की तुलना में, फ़्लैट व्यू हैरारकी परफ़ॉर्मेंस के लिए बेहतर होती है.ConstraintLayout
हालांकि, Compose में ऐसा नहीं होता. यह डीप लेआउट हैरारकी को आसानी से मैनेज कर सकता है.
ConstraintLayout
का कॉन्टेंट देखना शुरू करें
Compose में ConstraintLayout
का इस्तेमाल करने के लिए, आपको इस डिपेंडेंसी को अपने build.gradle
में जोड़ना होगा. इसके अलावा, आपको Compose सेटअप भी करना होगा:
implementation "androidx.constraintlayout:constraintlayout-compose:1.0.1"
ConstraintLayout
, Compose में डीएसएल का इस्तेमाल करके इस तरह काम करता है:
createRefs()
याcreateRefFor()
का इस्तेमाल करके,ConstraintLayout
में मौजूद हर कंपोज़ेबल के लिए रेफ़रंस बनाएंconstrainAs()
मॉडिफ़ायर का इस्तेमाल करके, कंस्ट्रेंट दिए जाते हैं. यह रेफ़रंस को पैरामीटर के तौर पर लेता है और आपको बॉडी लैम्डा में इसके कंस्ट्रेंट तय करने की अनुमति देता है.linkTo()
या अन्य मददगार तरीकों का इस्तेमाल करके, पाबंदियां तय की जाती हैं.parent
एक मौजूदा रेफ़रंस है. इसका इस्तेमाल,ConstraintLayout
कंपोज़ेबल के लिए सीमाएं तय करने के लिए किया जा सकता है.
यहां ConstraintLayout
का इस्तेमाल करने वाले कंपोज़ेबल का एक उदाहरण दिया गया है:
@Composable fun ConstraintLayoutContent() { ConstraintLayout { // Create references for the composables to constrain val (button, text) = createRefs() Button( onClick = { /* Do something */ }, // Assign reference "button" to the Button composable // and constrain it to the top of the ConstraintLayout modifier = Modifier.constrainAs(button) { top.linkTo(parent.top, margin = 16.dp) } ) { Text("Button") } // Assign reference "text" to the Text composable // and constrain it to the bottom of the Button composable Text( "Text", Modifier.constrainAs(text) { top.linkTo(button.bottom, margin = 16.dp) } ) } }
इस कोड में, Button
के टॉप को पैरंट के टॉप से 16.dp
मार्जिन के साथ और Button
के बॉटम को पैरंट के बॉटम से 16.dp
मार्जिन के साथ अलाइन किया गया है.Text
Decoupled API
ConstraintLayout
उदाहरण में, कंस्ट्रेंट को इनलाइन तौर पर तय किया गया है. साथ ही, कंपोज़ेबल में मॉडिफ़ायर का इस्तेमाल किया गया है. हालांकि, कुछ मामलों में यह बेहतर होता है कि लेआउट पर लागू होने वाली शर्तों को उनसे अलग कर दिया जाए. उदाहरण के लिए, आपको स्क्रीन कॉन्फ़िगरेशन के आधार पर कंस्ट्रेंट बदलने या दो कंस्ट्रेंट सेट के बीच ऐनिमेशन बनाने की ज़रूरत पड़ सकती है.
इस तरह के मामलों के लिए, ConstraintLayout
का इस्तेमाल अलग तरीके से किया जा सकता है:
ConstraintLayout
को पैरामीटर के तौर परConstraintSet
पास करें.layoutId
मॉडिफ़ायर का इस्तेमाल करके,ConstraintSet
में बनाए गए रेफ़रंस को कंपोज़ेबल असाइन करें.
@Composable fun DecoupledConstraintLayout() { BoxWithConstraints { val constraints = if (minWidth < 600.dp) { decoupledConstraints(margin = 16.dp) // Portrait constraints } else { decoupledConstraints(margin = 32.dp) // Landscape constraints } ConstraintLayout(constraints) { Button( onClick = { /* Do something */ }, modifier = Modifier.layoutId("button") ) { Text("Button") } Text("Text", Modifier.layoutId("text")) } } } private fun decoupledConstraints(margin: Dp): ConstraintSet { return ConstraintSet { val button = createRefFor("button") val text = createRefFor("text") constrain(button) { top.linkTo(parent.top, margin = margin) } constrain(text) { top.linkTo(button.bottom, margin) } } }
इसके बाद, जब आपको शर्तों में बदलाव करना हो, तब सिर्फ़ एक अलग ConstraintSet
पास करें.
ConstraintLayout
कॉन्सेप्ट
ConstraintLayout
में दिशा-निर्देश, बैरियर, और चेन जैसे कॉन्सेप्ट शामिल होते हैं. इनकी मदद से, कंपोज़ेबल में एलिमेंट को सही जगह पर रखा जा सकता है.
दिशा-निर्देश
दिशा-निर्देश, लेआउट डिज़ाइन करने में मदद करने वाले छोटे विज़ुअल होते हैं. कॉम्पोज़ेबल को किसी गाइडलाइन के हिसाब से सीमित किया जा सकता है. गाइडलाइन, पैरंट कंपोज़ेबल के अंदर किसी dp
या percentage
पर एलिमेंट को पोज़िशन करने के लिए काम आती हैं.
दिशा-निर्देश दो तरह के होते हैं: वर्टिकल और हॉरिज़ॉन्टल. दो हॉरिज़ॉन्टल लाइनें top
और bottom
हैं. वहीं, दो वर्टिकल लाइनें start
और end
हैं.
ConstraintLayout { // Create guideline from the start of the parent at 10% the width of the Composable val startGuideline = createGuidelineFromStart(0.1f) // Create guideline from the end of the parent at 10% the width of the Composable val endGuideline = createGuidelineFromEnd(0.1f) // Create guideline from 16 dp from the top of the parent val topGuideline = createGuidelineFromTop(16.dp) // Create guideline from 16 dp from the bottom of the parent val bottomGuideline = createGuidelineFromBottom(16.dp) }
दिशा-निर्देश बनाने के लिए, createGuidelineFrom*
का इस्तेमाल करें. साथ ही, दिशा-निर्देश का ज़रूरी टाइप भी डालें. इससे एक ऐसा रेफ़रंस बनता है जिसका इस्तेमाल Modifier.constrainAs()
ब्लॉक में किया जा सकता है.
बैरियर
Barriers, कई कंपोज़ेबल को रेफ़रंस करता है, ताकि तय की गई साइड पर मौजूद सबसे बड़े विजेट के आधार पर वर्चुअल गाइडलाइन बनाई जा सके.
बैरियर बनाने के लिए, createTopBarrier()
(या: createBottomBarrier()
,
createEndBarrier()
, createStartBarrier()
) का इस्तेमाल करें. साथ ही, ऐसे रेफ़रंस दें जिनसे बैरियर बनना चाहिए.
ConstraintLayout { val constraintSet = ConstraintSet { val button = createRefFor("button") val text = createRefFor("text") val topBarrier = createTopBarrier(button, text) } }
इसके बाद, बैरियर का इस्तेमाल Modifier.constrainAs()
ब्लॉक में किया जा सकता है.
चेन
चेन, एक ऐक्सिस (हॉरिज़ॉन्टल या वर्टिकल) में ग्रुप की तरह काम करती हैं . दूसरे ऐक्सिस को अलग से सीमित किया जा सकता है.
चेन बनाने के लिए, createVerticalChain
या createHorizontalChain
का इस्तेमाल करें:
ConstraintLayout { val constraintSet = ConstraintSet { val button = createRefFor("button") val text = createRefFor("text") val verticalChain = createVerticalChain(button, text, chainStyle = ChainStyle.Spread) val horizontalChain = createHorizontalChain(button, text) } }
इसके बाद, चेन का इस्तेमाल Modifier.constrainAs()
ब्लॉक में किया जा सकता है.
किसी चेन को अलग-अलग ChainStyles
के साथ कॉन्फ़िगर किया जा सकता है. इससे यह तय होता है कि कंपोज़ेबल के आस-पास की जगह को कैसे मैनेज किया जाए. जैसे:
ChainStyle.Spread
: स्पेस को सभी कंपोज़ेबल के बीच बराबर बांटा जाता है. इसमें पहले कंपोज़ेबल से पहले और आखिरी कंपोज़ेबल के बाद मौजूद खाली जगह भी शामिल है.ChainStyle.SpreadInside
: स्पेस को सभी कंपोज़ेबल के बीच बराबर बांटा जाता है. पहले कंपोज़ेबल से पहले या आखिरी कंपोज़ेबल के बाद कोई खाली जगह नहीं होती.ChainStyle.Packed
: स्पेस को पहले और आखिरी कंपोज़ेबल के बीच बांटा जाता है. कंपोज़ेबल को एक-दूसरे के बीच बिना किसी स्पेस के एक साथ रखा जाता है.
ज़्यादा जानें
ConstraintLayout
का इस्तेमाल करने वाले कंपोज़ के सैंपल में, कंपोज़ में इस्तेमाल किए जा रहे एपीआई से ConstraintLayout
के बारे में ज़्यादा जानें.
आपके लिए सुझाव
- ध्यान दें: JavaScript बंद होने पर लिंक टेक्स्ट दिखता है
- लिखते समय फ़ोकस करने की सुविधा
- Jetpack Compose के लिए Kotlin
- ईमेल लिखने के लेआउट के बारे में बुनियादी बातें