Challenge 2: Swapping Fragments — Solution
// fragment_welcome.xml — add a Button
// WelcomeFragment.kt
class WelcomeFragment : Fragment() {
private lateinit var binding: FragmentWelcomeBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
binding = FragmentWelcomeBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.viewDetailsButton.setOnClickListener {
parentFragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, DetailsFragment())
.commit()
}
}
}
// fragment_details.xml
// DetailsFragment.kt
class DetailsFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
return inflater.inflate(R.layout.fragment_details, container, false)
}
}
Notes:
- parentFragmentManager (accessed from inside a Fragment) is the
Fragment-side equivalent of the Activity's supportFragmentManager used
in Challenge 1 — both refer to the same underlying FragmentManager.
- replace(R.id.fragmentContainer, DetailsFragment()) removes
WelcomeFragment from the container and puts DetailsFragment in its
place — the same container ID from activity_main.xml is reused, since
it's the Activity's layout that hosts whichever Fragment is currently
active.
- The click listener is set up in onViewCreated (not onCreateView),
following this chapter's guidance that Views should be configured
after they're confirmed to exist, not while they're still being
inflated.