FrameLayout: मुख्य अवधारणाएँ, Android में सरल पोजिशनिंग

लेखक: IT Sectr प्रकाशित: 2026-02-24 पढ़ने का समय: 8 मिनट

FrameLayout की मुख्य अवधारणाएँ सीखें — Android SDK में सबसे सरल ViewGroup, जो एक एकल चाइल्ड तत्व (आमतौर पर) या कई तत्वों को एक दूसरे के ऊपर रखने के लिए डिज़ाइन की गई है। FrameLayout प्लेसहोल्डर कंटेनर, फ़्रैगमेंट, लोडिंग इंडिकेटर और फ़ोरग्राउंड तत्वों के लिए सुविधाजनक है। यह चाइल्ड की स्थिति का प्रबंधन नहीं करता — प्रत्येक बाद वाला तत्व पिछले वाले के ऊपर ड्रा होता है, और उनकी स्थिति layout_gravity (left, top, right, bottom, center) द्वारा निर्धारित की जाती है। बुनियादी परिदृश्य FrameLayout API Reference में वर्णित हैं।

मुख्य बातें

  • लेयर ओवरले — FrameLayout तत्वों को क्रमिक रूप से एक दूसरे के ऊपर रखता है; XML में अंतिम घोषित तत्व सबसे ऊपर ड्रा होता है।
  • फ़ोरग्राउंड — android:foreground एट्रिब्यूट सभी चाइल्ड तत्वों के ऊपर एक drawable रखने की अनुमति देता है, जो प्रभावों और मास्किंग के लिए उपयोगी है।
  • measureAllChildren — डिफ़ॉल्ट रूप से, FrameLayout सभी चाइल्ड को मापता है, अदृश्य (GONE) को भी। इसे बंद करने से ड्राइंग 20–60% तेज़ हो जाती है।
  • layout_gravity — FrameLayout के अंदर चाइल्ड तत्व की स्थिति निर्धारित करने का एकमात्र तरीका: top, bottom, left, right, center।
  • Fragment के साथ उपयोग — FrameLayout FragmentTransaction.replace() के लिए मानक कंटेनर है, जो गतिविधि को पुनः बनाए बिना सामग्री को बदलता है।

FrameLayout क्या है?

FrameLayout Android SDK में सबसे सरल ViewGroup है, जो स्क्रीन क्षेत्र को अवरुद्ध करने और एक एकल चाइल्ड व्यू (या कई को ओवरले) प्रदर्शित करने के लिए डिज़ाइन किया गया है। LinearLayout (क्रमिक स्थान) और RelativeLayout (सापेक्ष स्थिति) के विपरीत, FrameLayout चाइल्ड की स्थिति नहीं बदलता — प्रत्येक नया चाइल्ड डिफ़ॉल्ट रूप से ऊपरी बाएँ कोने (0,0) में रखा जाता है और पिछले वाले के ऊपर ड्रा होता है।

FrameLayout API Level 1 में पेश किया गया था और यह सबसे हल्का Android कंटेनर बना हुआ है: यह जटिल तर्क के साथ onMeasure को ओवरराइड नहीं करता और न्यूनतम layout संचालन करता है। Android Performance Blog के अनुसार, FrameLayout एक ही पास में onLayout निष्पादित करता है और View को सीधे रखने की तुलना में लगभग कोई ओवरहेड नहीं जोड़ता। यह इसे उन कंटेनरों के लिए आदर्श बनाता है जहाँ गति मायने रखती है: RecyclerView आइटम लेआउट (पोजिशनिंग के लिए ConstraintLayout के साथ), Fragment कंटेनर, ओवरले लेयर।

FrameLayout का आकार डिफ़ॉल्ट रूप से सबसे बड़े चाइल्ड तत्व (यदि match_parent सेट नहीं है) द्वारा निर्धारित होता है। यदि कोई चाइल्ड निर्दिष्ट नहीं है, FrameLayout (0,0) पर सिमट जाता है। android:measureAllChildren एट्रिब्यूट (नीचे अनुभाग) इस व्यवहार को बदलता है।

Android ViewGroup पदानुक्रम में FrameLayout

FrameLayout ViewGroup से इनहेरिट करता है और कई विशेष कंटेनरों का प्रत्यक्ष पैरेंट है: FragmentContainerView (फ़्रैगमेंट), CardView (छाया वाले कार्ड), ScrollView (एकल चाइल्ड), NestedScrollView। Fragment नेविगेशन के साथ Activity बनाते समय, मानक Android Studio टेम्पलेट फ़्रैगमेंट के लिए रूट कंटेनर के रूप में FrameLayout (या FragmentContainerView) का उपयोग करता है।

फ़ोरग्राउंड और measureAllChildren

android:foreground — एक FrameLayout एट्रिब्यूट जो सभी चाइल्ड तत्वों के ऊपर ड्रा होने वाले drawable को निर्दिष्ट करता है। background (चाइल्ड के नीचे) के विपरीत, foreground सामग्री के ऊपर प्रदर्शित होता है और पारदर्शी हो सकता है। इसका उपयोग किया जाता है: दबाने पर ओवरले प्रभाव (ripple ?attr/selectableItemBackground के माध्यम से), इमेज मास्किंग, स्थिति संकेतक प्रदर्शन (चित्र के ऊपर चयन चेकमार्क)।

Foreground मानक drawable संसाधनों का समर्थन करता है: ColorDrawable, ShapeDrawable, RippleDrawable, LayerDrawable। API 23+ के बाद से, फ़ोरग्राउंड पोजिशनिंग के लिए android:foregroundGravity उपलब्ध है (fill, center, top, bottom)। फ़िल मोड (fill) में, फ़ोरग्राउंड पूरे FrameLayout में फैल जाता है; सेंटर मोड में, यह केंद्र में ड्रा होता है।

android:measureAllChildren — एक बूलियन एट्रिब्यूट (डिफ़ॉल्ट true) जो निर्धारित करता है कि FrameLayout आकार की गणना करते समय सभी चाइल्ड तत्वों को मापना है या नहीं। यदि true (डिफ़ॉल्ट), FrameLayout GONE (आकार 0 के साथ) सहित सभी चाइल्ड के आकार को ध्यान में रखता है। यदि false, FrameLayout केवल VISIBLE और INVISIBLE चाइल्ड को मापता है — GONE तत्व गणना से बाहर हो जाते हैं। Google I/O 2019 के अनुसार, कई GONE तत्वों (जैसे, दृश्यता टॉगल करने वाली सूचियाँ) वाले कंटेनरों के लिए measureAllChildren को बंद करने से प्रारंभिक ड्राइंग 20–60% तक तेज़ हो जाती है।

layout_gravity: FrameLayout के अंदर पोजिशनिंग

android:layout_gravity — FrameLayout (और अन्य ViewGroups) के चाइल्ड तत्व का एक एट्रिब्यूट जो कंटेनर के अंदर उसकी स्थिति निर्धारित करता है। FrameLayout में, layout_gravity चाइल्ड तत्व की स्थिति को नियंत्रित करने का एकमात्र तरीका है, क्योंकि FrameLayout अपने स्वयं के पोजिशनिंग नियम (जैसे RelativeLayout) या दिशा (जैसे LinearLayout) प्रदान नहीं करता।

संभावित मान: top, bottom, left, right, center, center_horizontal, center_vertical, fill, fill_horizontal, fill_vertical, clip_horizontal, clip_vertical। | के माध्यम से संयोजित: android:layout_gravity="bottom|center_horizontal" — तत्व निचले किनारे से जुड़ा होता है और क्षैतिज रूप से केंद्रित होता है। FrameLayout से छोटे तत्वों के लिए, layout_gravity खाली स्थान में उनकी स्थिति निर्धारित करता है।

यदि layout_gravity सेट नहीं है, तो तत्व डिफ़ॉल्ट रूप से ऊपरी बाएँ कोने (top|left) में रखा जाता है। कई चाइल्ड वाले FrameLayout के लिए, प्रत्येक का अपना layout_gravity हो सकता है — एक तत्व ऊपरी बाएँ कोने में हो सकता है, दूसरा निचले दाएँ कोने में, तीसरा केंद्र में। यह सरल ओवरले बनाने की अनुमति देता है (उदाहरण के लिए, चित्र के ऊपर क्लोज़ आइकन)।

अंतर: gravity बनाम layout_gravity

android:gravity (पैरेंट एट्रिब्यूट) FrameLayout के अंदर सामग्री को संरेखित करता है — उदाहरण के लिए, TextView के अंदर टेक्स्ट। android:layout_gravity (चाइल्ड एट्रिब्यूट) तत्व को स्वयं FrameLayout के अंदर संरेखित करता है। FrameLayout के संदर्भ में, gravity परिभाषित करता है कि चाइल्ड डिफ़ॉल्ट रूप से कैसे स्थित हों (सभी चाइल्ड के लिए एक साथ layout_gravity के समान), लेकिन प्रत्येक विशिष्ट तत्व का layout_gravity पैरेंट मान को ओवरराइड करता है।

उदाहरण: XML और उपयोग के मामले

उदाहरण 1: मूल ओवरले — इमेज पर लेबल

एक इमेज जिसके निचले दाएँ कोने में टेक्स्ट लेबल है। FrameLayout में पूरी स्क्रीन भरने वाला ImageView और इमेज के ऊपर पोजिशनिंग के लिए layout_gravity="bottom|end" वाला TextView है।

xml
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="200dp">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/product_photo"
        android:scaleType="centerCrop" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="8dp"
        android:background="@drawable/badge_background"
        android:elevation="2dp"
        android:paddingHorizontal="8dp"
        android:paddingVertical="4dp"
        android:text="-30%"
        android:textColor="@android:color/white"
        android:textSize="14sp"
        android:textStyle="bold" />

</FrameLayout>

ImageView पूरे FrameLayout (200dp ऊँचाई) को भरता है। layout_gravity="bottom|end" वाला TextView इमेज के ऊपर निचले दाएँ कोने में रखा जाता है। elevation=2dp लेबल के नीचे छाया जोड़ता है, इसे इमेज से दृश्य रूप से अलग करता है। इस न्यूनतम उदाहरण के लिए LinearLayout में नेस्टेड कंटेनर या कस्टम कोड की आवश्यकता होगी।

उदाहरण 2: लोडिंग इंडिकेटर (सामग्री के ऊपर प्रोग्रेस बार)

सामग्री और एक केंद्रित प्रोग्रेस बार वाली स्क्रीन जो लोडिंग के दौरान दिखाई देता है। FrameLayout में दो तत्व हैं: सामग्री और visibility="gone" वाला ProgressBar (कोड में टॉगल किया गया)।

xml
<FrameLayout
    android:id="@+id/content_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/content_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="लोड की गई सामग्री"
        android:textSize="18sp" />

    <ProgressBar
        android:id="@+id/loading_spinner"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_gravity="center"
        android:visibility="gone" />

</FrameLayout>

ProgressBar डिफ़ॉल्ट रूप से छिपा हुआ है (gone)। जब लोडिंग शुरू होती है, findViewById(R.id.loading_spinner).visibility = View.VISIBLE कॉल किया जाता है — स्पिनर सामग्री के ऊपर केंद्र में दिखाई देता है। लोडिंग के बाद — .visibility = View.GONE। FrameLayout सामग्री की स्थिति बदले बिना ओवरले प्रदान करता है — स्पिनर दिखाई देने पर टेक्स्ट नहीं हिलता, क्योंकि ProgressBar ऊपर ड्रा होता है।

उदाहरण 3: Fragment कंटेनर

FrameLayout FragmentTransaction के लिए मानक कंटेनर के रूप में। गतिविधि नेविगेशन के आधार पर इस कंटेनर के अंदर फ़्रैगमेंट बदलती है।

xml
<FrameLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
kotlin
import androidx.fragment.app.FragmentTransaction

val fragmentContainer = R.id.fragment_container

fun navigateTo(fragment: Fragment) {
    supportFragmentManager
        .beginTransaction()
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
        .replace(fragmentContainer, fragment)
        .addToBackStack(null)
        .commit()
}

FrameLayout फ़्रैगमेंट कंटेनर के रूप में Fragment Navigation को सपोर्ट करने का सबसे हल्का तरीका है। Navigation Component 2.4+ के साथ FragmentContainerView (FrameLayout की उपश्रेणी) की अनुशंसा की जाती है, लेकिन सादा FrameLayout मैन्युअल FragmentTransaction के लिए मान्य रहता है। मुख्य लाभ यह है कि FragmentTransaction.replace() Activity को प्रभावित किए बिना सामग्री को पूरी तरह से बदल देता है।

FrameLayout का उपयोग कब करें

FrameLayout चार परिदृश्यों के लिए इष्टतम है: फ़्रैगमेंट कंटेनर (FragmentContainerView या FrameLayout), लोडिंग ओवरले (सामग्री के ऊपर ProgressBar), कार्ड लेबल (इमेज पर लेबल), ViewStub के लिए प्लेसहोल्डर कंटेनर (आलसी लोडिंग)।

इसके लिए उपयुक्त नहीं: कई तत्वों की जटिल पोजिशनिंग (ConstraintLayout का उपयोग करें), अनुक्रमिक सूचियाँ (LinearLayout या RecyclerView), तत्व क्रम बदलने वाले डायनामिक लेआउट।

FrameLayout को स्क्रीन के रूट तत्व के रूप में — खराब अभ्यास यदि स्क्रीन में 2–3 से अधिक तत्व हैं। रूट कंटेनर के लिए, ConstraintLayout का उपयोग करें — यह प्रदर्शन हानि के बिना पोजिशनिंग पर अधिक नियंत्रण देता है। FrameLayout का उपयोग केवल चाइल्ड ब्लॉक के लिए करें जहाँ ओवरले या प्लेसहोल्डर की आवश्यकता है।

अक्सर पूछे जाने वाले प्रश्न

FrameLayout और ConstraintLayout में क्या अंतर है?

FrameLayout — एक न्यूनतम कंटेनर जिसमें कोई पोजिशनिंग सिस्टम नहीं (केवल layout_gravity), तत्वों को ओवरले करने के लिए डिज़ाइन किया गया। ConstraintLayout — एक पूर्ण लेआउट सिस्टम जिसमें कॉन्स्ट्रेंट, चेन, बैरियर, प्रतिशत आयाम और MotionLayout समर्थन है। FrameLayout सरल मामलों (1 चाइल्ड या ओवरले) के लिए तेज़ है; जटिल लेआउट के लिए ConstraintLayout आवश्यक है। चुनाव: FrameLayout लोडिंग ओवरले और फ़्रैगमेंट कंटेनर के लिए; ConstraintLayout बाकी सबके लिए।

FrameLayout को केवल सबसे बड़े चाइल्ड का स्थान लेने के लिए कैसे करें?

वांछित अक्ष पर FrameLayout का आकार wrap_content पर सेट करें (android:layout_width="wrap_content" और/या android:layout_height="wrap_content")। FrameLayout तब सबसे बड़े चाइल्ड तत्व के आकार में समायोजित हो जाएगा। यदि सभी चाइल्ड FrameLayout से छोटे हैं, तो अतिरिक्त स्थान खाली रहता है। सटीक नियंत्रण के लिए, निश्चित padding के साथ match_parent का उपयोग करें।

FrameLayout में तत्व एक दूसरे को क्यों ओवरलैप करते हैं?

यह FrameLayout का इच्छित व्यवहार है — यह चाइल्ड को स्थान में वितरित नहीं करता बल्कि उन्हें क्रमिक रूप से एक दूसरे के ऊपर ड्रा करता है। यदि आप चाहते हैं कि तत्व ओवरलैप न हों, तो दूसरे कंटेनर (LinearLayout, ConstraintLayout) का उपयोग करें। ड्राइंग क्रम पर नियंत्रण के साथ आंशिक ओवरलैप के लिए, ऑफ़सेट के लिए layout_gravity और Z-क्रम के लिए elevation का उपयोग करें।

कौन तेज़ है: FrameLayout या ConstraintLayout?

FrameLayout तेज़ है सबसे सरल मामलों के लिए — एक चाइल्ड तत्व, बिना जटिल पोजिशनिंग के। FrameLayout कॉन्स्ट्रेंट की गणना किए बिना न्यूनतम समय में onMeasure करता है। हालाँकि, अंतर केवल सैकड़ों दोहराव (दसियों हज़ार आइटम वाले RecyclerView) पर ध्यान देने योग्य है। सामान्य स्क्रीन (1–3 FrameLayout) के लिए, अंतर माइक्रोसेकंड में है और UX को प्रभावित नहीं करता। ConstraintLayout 95% कार्यों के लिए सार्वभौमिक विकल्प है।

सारांश

  • FrameLayout — न्यूनतम ओवरहेड के साथ तत्वों को ओवरले करने और प्लेसहोल्डर कंटेनरों के लिए सबसे सरल Android ViewGroup।
  • लेयर ओवरले — प्रत्येक नया चाइल्ड पिछले वाले के ऊपर ड्रा होता है; XML में अंतिम घोषित सबसे ऊपर होता है।
  • फ़ोरग्राउंड — ओवरले प्रभाव, मास्किंग और रिपल एनिमेशन के लिए सभी चाइल्ड के ऊपर एक drawable।
  • measureAllChildren — बंद करने (false) पर GONE तत्व आकार गणना से बाहर हो जाते हैं, ड्राइंग 20–60% तेज़ हो जाती है।
  • layout_gravity — एकमात्र पोजिशनिंग तंत्र: top, bottom, left, right, center और उनके संयोजन।
  • Fragment कंटेनर — सबसे सामान्य उपयोग मामला: FragmentTransaction.replace() के लिए FrameLayout (या FragmentContainerView)।
  • प्रदर्शन — 1 चाइल्ड के लिए सबसे तेज़ कंटेनर; जटिल लेआउट के लिए, यह ConstraintLayout से पीछे रह जाता है।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें