Column क्यों नहीं सुनती? Jetpack Compose में सेंटरिंग का अभिशाप
\nक्या आपने कभी रात में कॉफी के कप के साथ बैठकर Jetpack Compose के लिए Kotlin कोड लिखा और अचानक देखा कि आपकी Column हठपूर्वक सामग्री को केंद्रित करने से इनकार कर रही है? आप Modifier.align(Alignment.CenterHorizontally) जोड़ते हैं — लेकिन टेक्स्ट फिर भी बाएँ किनारे से चिपका रहता है। परिचित लगता है?
यह समस्या Stack Overflow पर एक वास्तविक हिट है। हज़ारों डेवलपर्स (और मैं भी उनमें से एक) ने यह समझने की कोशिश में अपना सिर पटक लिया कि "gravity center" कहाँ गायब हो गया। इस लेख में हम शीर्ष गलतियों का विश्लेषण करेंगे जो आपकी Column को एक बेकाबू सूची में बदल देती हैं, और उनसे बचना सीखेंगे। तैयार हो जाइए: बहुत सारा कोड, जीवंत उदाहरण और कोई फालतू बात नहीं होगी।
\n\nगलती #1: Column और Row के बीच भ्रम
\nपहला और सबसे आम जाल — क्लासिक Android XML से आदतों को स्थानांतरित करना। वहाँ LinearLayout में gravity="center" विशेषता थी। Compose में सब कुछ अलग है।
मुख्य अंतर: Column तत्वों को लंबवत रखता है। इसलिए "क्षैतिज रूप से केंद्रित करना" Column की अपनी संपत्ति नहीं है, बल्कि इसके चाइल्ड तत्वों का व्यवहार है। यदि आप लिखते हैं:
Column(\n modifier = Modifier.fillMaxSize(),\n horizontalAlignment = Alignment.CenterHorizontally\n) {\n Text("नमस्ते, दुनिया!")\n}\nयहाँ horizontalAlignment काम करता है, लेकिन केवल तभी जब Text स्वयं चौड़ाई में सीमित न हो। और यदि आपके पास चाइल्ड तत्व पर Modifier.fillMaxWidth() है — तो सेंटरिंग टूट जाएगी। क्यों? क्योंकि तत्व पूरी चौड़ाई में फैल जाता है, और उसके अंदर केंद्रित करने के लिए कुछ नहीं बचता।
गलती #2: horizontalAlignment के बजाय Modifier.align()
\nयहाँ एक क्लासिक ट्रैप कोड है जो Stack Overflow पर घूमता है:
\nColumn(\n modifier = Modifier.fillMaxSize()\n) {\n Text(\n text = "मुझे केंद्र में होना चाहिए",\n modifier = Modifier.align(Alignment.CenterHorizontally)\n )\n}\nपहली नज़र में — तार्किक। लेकिन यह काम नहीं करेगा यदि Column में horizontalAlignment सेट नहीं है। बात यह है कि Modifier.align() — यह Box और ColumnScope के लिए एक मॉडिफ़ायर है। यह Column के अंदर ही उपलब्ध है, लेकिन horizontalAlignment के साथ मिलकर काम करता है। यदि बाद वाला निर्दिष्ट नहीं है, तो align को अनदेखा कर दिया जाता है।
कैसे ठीक करें:
\nColumn(\n modifier = Modifier.fillMaxSize(),\n horizontalAlignment = Alignment.CenterHorizontally // अनिवार्य!\n) {\n Text(\n text = "अब मैं केंद्र में हूँ",\n modifier = Modifier.align(Alignment.CenterHorizontally) // वैकल्पिक\n )\n}\n\nगलती #3: लंबवत के लिए Arrangement को भूलना
\nअक्सर डेवलपर्स Column की सामग्री को लंबवत (Y-अक्ष पर) केंद्रित करना चाहते हैं। यहाँ verticalArrangement काम में आता है:
Column(\n modifier = Modifier.fillMaxSize(),\n verticalArrangement = Arrangement.Center,\n horizontalAlignment = Alignment.CenterHorizontally\n) {\n Text("ब्रह्मांड का केंद्र")\n Button(onClick = { }) { Text("बटन") }\n}\nलेकिन एक बारीकी है: Arrangement.Center तभी काम करेगा जब Column स्क्रीन की पूरी ऊँचाई घेरता हो (Modifier.fillMaxSize() या Modifier.height(IntrinsicSize.Min)। यदि Column की ऊँचाई चाइल्ड तत्वों की ऊँचाई के योग के बराबर है — तो केंद्रित करने के लिए कोई जगह नहीं होगी।
गलती #4: IntrinsicSize और अप्रत्याशित व्यवहार
\nकभी-कभी आप Column को सामग्री के अनुसार सिकोड़ने के लिए Modifier.height(IntrinsicSize.Min) जोड़ते हैं। और तब लंबवत सेंटरिंग टूट जाती है:
Column(\n modifier = Modifier\n .fillMaxWidth()\n .height(IntrinsicSize.Min),\n verticalArrangement = Arrangement.Center\n) {\n Text("टेक्स्ट 1")\n Text("टेक्स्ट 2")\n}\nसमस्या:
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें