Fragment Android میں ایک دوبارہ استعمال ہونے والا UI جزو ہے جو Activity میں شامل کیا جاتا ہے اور FragmentManager کے ذریعے منظم کیا جاتا ہے۔ ہر فریگمنٹ کا اپنا لائف سائیکل، layout اور حالت ہوتی ہے۔ Fragment مختلف اسکرین سائزز کے مطابق ڈھلنے اور کوڈ کے دوبارہ استعمال کو آسان بناتا ہے۔ Google کی سرکاری گائیڈ میں مزید پڑھیں۔
اہم نکات
Fragment Android کا ایک ماڈیولر یوزر انٹرفیس جزو ہے جو Activity کے اندر اسکرین کے ایک حصے کی نمائندگی کرتا ہے۔ Fragment اپنے layout کو منظم کر سکتا ہے، لائف سائیکل کے واقعات کو ہینڈل کر سکتا ہے اور اپنی حالت محفوظ کر سکتا ہے۔ ماڈیولریٹی کی بدولت، ایک فریگمنٹ مختلف Activities اور مختلف آلات پر استعمال کیا جا سکتا ہے۔
Fragment API Android 3.0 (Honeycomb, API 11) میں 2011 میں ٹیبلٹس کی حمایت کے لیے ظاہر ہوا۔ اس سے پہلے، ڈویلپرز کو فون اور ٹیبلٹ کے لیے الگ Activities بنانی پڑتی تھیں۔ Fragment نے آزاد بلاکس سے اسکرین جمع کرنا ممکن بنایا۔ 2019 میں، Google نے API 4 تک پسماندہ مطابقت کے ساتھ Jetpack Fragment لائبریری جاری کی۔
Google (2026) کے مطابق، Google Play میں 80% ایپس کسی نہ کسی شکل میں Fragment استعمال کرتی ہیں۔ Jetpack Fragment لائبریری Google Play Services کے ذریعے 10 بلین سے زیادہ بار ڈاؤن لوڈ کی گئی ہے۔ Fragment Jetpack Compose کے دور میں بھی Android آرکیٹیکچر کا ایک اہم جزو بنا ہوا ہے۔
Fragment کا لائف سائیکل Activity سے زیادہ پیچیدہ ہے کیونکہ یہ میزبان Activity کی حالت پر منحصر ہے۔ Fragment Activity کی طرح کے مراحل سے گزرتا ہے لیکن اپنے کال بیکس شامل کرتا ہے: onAttach، onCreateView، onViewCreated، onActivityCreated، onDestroyView، onDetach۔
| Fragment کال بیک | Activity مساوی | مقصد |
|---|---|---|
| onAttach | onCreate سے پہلے | Fragment Activity سے منسلک |
| onCreate | onCreate | غیر UI ڈیٹا کی ابتدا |
| onCreateView | onCreate | inflater کے ذریعے layout بنانا |
| onViewCreated | onCreate | View بننے کے بعد UI عناصر کو باندھنا |
| onDestroyView | onDestroy | View ہٹانا، UI وسائل جاری کرنا |
| onDetach | onDestroy | Fragment Activity سے الگ |
Fragment لائف سائیکل کا بنیادی فرق onCreate اور onDestroy کے درمیان onCreateView اور onDestroyView کا بلایا جانا ہے۔ Fragment UI کے بغیر موجود ہو سکتا ہے (اگر onCreateView null لوٹاتا ہے)۔ Activity کی دوبارہ تخلیق کے بعد، FragmentManager خود بخود فریگمنٹس کو بحال کرتا ہے۔
FragmentManager Activity میں فریگمنٹس کو منظم کرنے کے لیے مرکزی کلاس ہے۔ یہ فریگمنٹس کو شامل کرنے، ہٹانے، تبدیل کرنے، بیک اسٹیک کو منظم کرنے اور حالت بحال کرنے کا ذمہ دار ہے۔ FragmentManager supportFragmentManager (AndroidX) یا fragmentManager (پرانی API) کے ذریعے دستیاب ہے۔
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// فریگمنٹ ابھی شامل نہیں کیا گیا — بنا رہے ہیں
if (savedInstanceState == null) {
val transaction = this.supportFragmentManager
.beginTransaction()
transaction.add(R.id.fragment_container, ListFragment())
transaction.addToBackStack(null)
transaction.commit()
}
}
fun replaceFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit()
}
}FragmentTransaction لین دین ایٹمی ہوتے ہیں۔ commit() اگلے Looper سائیکل پر عملدرآمد طے کرتا ہے۔ فوری عملدرآمد کے لیے commitNow() استعمال کریں۔ addToBackStack(null) لین دین کو بیک اسٹیک میں شامل کرتا ہے — واپسی کا بٹن عمل کو کالعدم کر دے گا۔
Kotlin میں ایک مثال کے ساتھ Fragment لائف سائیکل کے اہم طریقوں کو دیکھیں۔ onCreateView ایک layout بناتا ہے — Activity کے برعکس، طریقے کو ایک View لوٹانا ہوتا ہے۔ onViewCreated فوراً بعد بلایا جاتا ہے، یہاں id کے ذریعے عناصر تلاش کرنا محفوظ ہے۔ onDestroyView View حوالہ جات صاف کرنے کا آخری موقع ہے۔
class DetailFragment : Fragment() {
private var _binding: FragmentDetailBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentDetailBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.textTitle.setText("تفصیلات")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}View Binding پیٹرن _binding/binding کے ساتھ اس بات کی ضمانت دیتا ہے کہ onDestroyView کے بعد layout کا حوالہ null ہو جاتا ہے۔ View تباہ ہونے کے بعد binding تک رسائی NullPointerException کا سبب بنے گی۔ Google اس پیٹرن کو تمام فریگمنٹس کے لیے تجویز کرتا ہے۔
فریگمنٹس کے درمیان ڈیٹا کی منتقلی کے لیے Android کئی میکانزم فراہم کرتا ہے۔ سب سے قابل اعتماد ایک مشترکہ ViewModel ہے، جو ایک Activity کے فریگمنٹس کے درمیان شیئر کیا جاتا ہے۔ Fragment Result API ایک بار کے واقعات کے لیے موزوں ہے۔ Bundle دلائل فریگمنٹ بناتے وقت ڈیٹا کے لیے ہیں۔
// دو فریگمنٹس کے لیے مشترکہ ViewModel
class SharedViewModel : ViewModel() {
private val _selectedItem = MutableLiveData<Item>()
val selectedItem: LiveData<Item> = _selectedItem
fun select(item: Item) { _selectedItem.setValue(item) }
}
// فریگمنٹ A: Fragment Result API کے ذریعے واقعہ بھیجتا ہے
setFragmentResult("request_key", bundleOf("key" to "value"))
// فریگمنٹ B: واقعہ وصول کرتا ہے
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
val value = bundle.getString("key")
}Fragment Result API (Fragment 1.3.0 میں شامل کیا گیا) متروک setTargetFragment/onActivityResult کی جگہ لیتا ہے۔ API ٹائپ محفوظ ہے، Bundle استعمال کرتا ہے، اور وصول کنندہ کے علم کی ضرورت نہیں ہے۔ Parent FragmentManager فریگمنٹس کے درمیان ثالث کا کام کرتا ہے۔
Fragment اور Activity کے درمیان انتخاب ایپلیکیشن آرکیٹیکچر پر منحصر ہے۔ Fragment انکولی لے آؤٹ (فون + ٹیبلٹ)، حسب ضرورت ٹرانزیشن اینیمیشن اور Jetpack Navigation کے استعمال کے لیے لازمی ہے۔ Activity ایک یا دو اسکرین والی سادہ ایپس کے لیے ترجیحی ہے۔
| معیار | Fragment | Activity |
|---|---|---|
| تخلیق کی رفتار | تیز (ہلکا جزو) | سست (سسٹم عمل) |
| دوبارہ استعمال | اعلی (ایک Fragment مختلف Activities میں) | کم (ہر اسکرین کا اپنا Activity) |
| ٹرانزیشن اینیمیشن | لچکدار (FragmentTransaction) | محدود (overridePendingTransition) |
| گھمانے پر تحفظ | خودکار (منتظم بحال کرتا ہے) | دستی (onSaveInstanceState) |
| Deep Links | Navigation Component کے ذریعے | intent-filter کے ذریعے مقامی حمایت |
Fragment کے ساتھ کام کرنے کا جدید طریقہ Jetpack Navigation Component ہے، جو دستی FragmentManager انتظام کو تبدیل کرتا ہے۔ لائبریری NavGraph (XML نیویگیشن گراف)، NavHostFragment اور ٹائپ محفوظ ڈیٹا کی منتقلی کے لیے Safe Args فراہم کرتی ہے۔
Jetpack Fragment لائبریری (androidx.fragment:fragment-ktx) میں FragmentResult API، DialogFragment، BottomSheetDialogFragment اور Lifecycle-aware اجزاء کے ساتھ انضمام شامل ہے۔ 2026 سے، Google براہ راست نہیں بلکہ صرف Jetpack Navigation کے ذریعے Fragment استعمال کرنے کی تجویز کرتا ہے۔
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:startDestination="@+id/listFragment">
<fragment
android:id="@+id/listFragment"
android:name=".ListFragment"
android:label="فہرست">
<action
android:id="@+id/action_list_to_detail"
app:destination="@+id/detailFragment" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name=".DetailFragment"
android:label="تفصیلات" />
</navigation>اکثر پوچھے گئے سوالات
FragmentManager ایک کلاس ہے جو فریگمنٹ لین دین کو منظم کرتی ہے۔ یہ Activity کنٹینر میں فریگمنٹس کو شامل، ہٹاتی اور تبدیل کرتی ہے۔ FragmentManager Activity کی دوبارہ تخلیق پر فریگمنٹ کی حالت بحال کرتا ہے اور بیک اسٹیک کو منظم کرتا ہے۔
Fragment Activity کے اندر UI کا ایک حصہ ہے، یہ آزادانہ طور پر موجود نہیں رہ سکتا۔ Fragment اسکرین گھمانے پر Activity کی دوبارہ تخلیق سے بچ جاتا ہے۔ Activity اپنے Lifecycle کے ساتھ ایک مکمل اسکرین ہے، Fragment Activity کے Lifecycle پر منحصر ہے۔
Fragment — جب اسکرین کئی آزاد بلاکس پر مشتمل ہو (ٹیبز، ماسٹر-ڈیٹیل، ٹیبلٹ موافقت)۔ Activity — جب اسکرین میں دہرائے جانے والے بلاکس نہ ہوں۔ Google Single Activity + متعدد Fragment تجویز کرتا ہے۔
تین طریقے: پیرنٹ Activity کے ذریعے (مشترکہ ViewModel)، Fragment Result API (setFragmentResult) کے ذریعے، Fragment بناتے وقت Bundle دلائل کے ذریعے۔ ViewModel ترجیحی طریقہ ہے کیونکہ ڈیٹا دوبارہ تخلیق کے دوران محفوظ رہتا ہے۔
Fragment Transaction ایک ایٹمی عمل ہے جو فریگمنٹ سیٹ کو تبدیل کرتا ہے۔ FragmentManager.beginTransaction() ایک لین دین کھولتا ہے جہاں add، remove، replace، hide، show بلایا جا سکتا ہے۔ ہر لین دین commit() یا commitNow() پر ختم ہوتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں