📋 Screens, Lists और Navigation · Lesson 24
Fragments और Fragment Lifecycle
Fragment क्या है?
Fragment screen का reusable हिस्सा है जिसका अपना layout और lifecycle है, और जो Activity के अंदर रहता है। Modern apps एक Activity (toolbar, drawer, bottom bar) रखती हैं और हर screen के लिए fragments बदलती हैं।
Fragment बनाइए
File → New → Fragment → Fragment (Blank), फिर इसे इस pattern में साफ़ करें:
Kotlin – HomeFragment.kt
// HomeFragment.kt
class HomeFragment : Fragment() {
private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentHomeBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.btnDetails.setOnClickListener {
(requireActivity() as MainActivity).showDetails("Maths")
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}Activity में host करें
XML
<!-- activity_main.xml -->
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />Kotlin – MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState == null) { // don't add again after rotation
supportFragmentManager.commit {
add(R.id.fragmentContainer, HomeFragment())
}
}
}
fun showDetails(subject: String) {
supportFragmentManager.commit {
setReorderingAllowed(true)
replace(R.id.fragmentContainer, DetailsFragment.newInstance(subject))
addToBackStack("details") // Back returns to HomeFragment
}
}
}Replace और back stack
supportFragmentManager.commit { } fragment-ktx से आता है। Navigation Component (अगला lesson) graph से यह सब आपके लिए करता है।
Arguments भेजें
Kotlin – DetailsFragment.kt
class DetailsFragment : Fragment(R.layout.fragment_details) { // layout in the constructor
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val binding = FragmentDetailsBinding.bind(view)
val subject = requireArguments().getString(ARG_SUBJECT) ?: "-"
binding.tvTitle.text = "Notes of $subject"
}
companion object {
private const val ARG_SUBJECT = "subject"
fun newInstance(subject: String) = DetailsFragment().apply {
arguments = bundleOf(ARG_SUBJECT to subject)
}
}
}Fragment lifecycle
Fragments के बीच data share
Kotlin – activityViewModels()
// One ViewModel shared by every fragment of the Activity
class SharedViewModel : ViewModel() {
val selectedSubject = MutableLiveData<String>()
}
// ListFragment
private val shared: SharedViewModel by activityViewModels()
adapter.onClick = { shared.selectedSubject.value = it.name }
// DetailsFragment
private val shared: SharedViewModel by activityViewModels()
shared.selectedSubject.observe(viewLifecycleOwner) { binding.tvTitle.text = it }आम गलतियाँ
savedInstanceState == nullcheck किए बिना onCreate में fragment add करना → rotation के बाद दो fragments एक के ऊपर एक।onDestroyViewके बादbindinguse करना → crash।observe(viewLifecycleOwner)की जगहobserve(this)→ duplicate updates और leaks।- Fragment में constructor parameters → recreation पर crash; arguments use करें।
सारांश
- Fragment = अपने layout + lifecycle वाला screen हिस्सा; एक Activity कई host करती है।
- Pattern: onCreateView में
_binding, onViewCreated में setup, onDestroyView में clear। - FragmentManager: add / replace / addToBackStack;
bundleOfसे arguments। activityViewModels()से data share करें।
✅ Practice
HomeFragment (3 subjects की list) और DetailsFragment वाली app बनाइए। Subject tap करने पर arguments के साथ fragment replace हो; Back से list पर लौटें।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
नई screen के लिए Activity या Fragment?
ज़्यादातर modern apps एक Activity और हर screen के लिए एक Fragment use करती हैं, जो Navigation Component से जुड़े होते हैं। Fragments हल्के होते हैं और toolbar, drawer, bottom navigation share करते हैं।
Fragment में this की जगह viewLifecycleOwner क्यों?
Fragment अपने view से ज़्यादा देर ज़िंदा रह सकता है (जैसे back stack पर)। viewLifecycleOwner से observe करने पर view destroy होते ही updates रुक जाते हैं, जिससे crashes और leaks नहीं होते।
क्या fragment का parameters वाला constructor हो सकता है?
नहीं। Android fragments को empty constructor से दोबारा बनाता है। Data arguments (Bundle) से भेजें।
