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 مواد کے اوپر ظاہر ہوتا ہے اور شفاف ہو سکتا ہے۔ اس کے لیے استعمال کیا جاتا ہے: دبانے پر اوورلے اثرات (?attr/selectableItemBackground کے ذریعے ripple)، تصویر ماسکنگ، اسٹیٹس انڈیکیٹر ظاہر کرنا (تصویر پر انتخاب کا نشان)۔

Foreground معیاری drawable وسائل کو سپورٹ کرتا ہے: ColorDrawable، ShapeDrawable، RippleDrawable، LayerDrawable۔ API 23+ سے، پیش منظر کی پوزیشننگ کے لیے android:foregroundGravity دستیاب ہے (fill, center, top, bottom)۔ بھرنے کے موڈ (fill) میں foreground پورے 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 میں nested کنٹینر یا حسب ضرورت کوڈ درکار ہوگا۔

مثال 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 کنٹینر

FragmentTransaction کے لیے معیاری کنٹینر کے طور پر FrameLayout۔ ایکٹیویٹی نیویگیشن کے مطابق اس کنٹینر کے اندر فریگمنٹس کو تبدیل کرتی ہے۔

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 — مکمل لے آؤٹ سسٹم جس میں constraints، chains، barriers، فیصدی طول و عرض اور 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 constraints کا حساب لگائے بغیر کم سے کم وقت میں onMeasure انجام دیتا ہے۔ تاہم، فرق صرف سینکڑوں تکرار (دسیوں ہزار آئٹمز والے RecyclerView) پر نمایاں ہوتا ہے۔ عام اسکرین (1–3 FrameLayout) کے لیے، فرق مائیکرو سیکنڈز میں ہے اور UX کو متاثر نہیں کرتا۔ ConstraintLayout 95% کاموں کے لیے عالمگیر انتخاب ہے۔

خلاصہ

  • FrameLayout — کم سے کم اضافی بوجھ کے ساتھ عناصر کو اوورلے کرنے اور پلیس ہولڈر کنٹینرز کے لیے سب سے آسان Android ViewGroup۔
  • پرت اوورلے — ہر نیا چائلڈ پچھلے کے اوپر کھینچتا ہے؛ XML میں آخری اعلان کردہ سب سے اوپر ہے۔
  • پیش منظر — اوورلے اثرات، ماسکنگ اور ripple اینی میشن کے لیے تمام چائلڈ کے اوپر ایک drawable۔
  • measureAllChildren — غیر فعال کرنے (false) سے GONE عناصر سائز کے حساب سے خارج ہو جاتے ہیں، ڈرائنگ 20–60% تیز ہو جاتی ہے۔
  • layout_gravity — واحد پوزیشننگ mechanism: top, bottom, left, right, center اور ان کے امتزاج۔
  • Fragment کنٹینر — سب سے عام استعمال کا معاملہ: FragmentTransaction.replace() کے لیے FrameLayout (یا FragmentContainerView)۔
  • کارکردگی — 1 چائلڈ کے لیے تیز ترین کنٹینر؛ پیچیدہ لے آؤٹ کے لیے ConstraintLayout سے پیچھے رہ جاتا ہے۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں