Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Fragment not getting added with add from fragmentManager

I’m trying to follow android’s guide to creating a fragment programmatically but I find that the fragment isn’t getting added and that it’s onViewCreated method is never called.

I’m not getting any error or crash, the fragment just doesn’t appear. I have been on this for more than a day so any help is appreciated.

Here’s the code from my MainActivity.kt :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

class MainActivity : AppCompatActivity(R.layout.main_activity) {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    if (savedInstanceState == null) {
        supportFragmentManager.commit {
            setReorderingAllowed(true)
            add<MessagesFragment>(R.id.fragment_container_view)
        }
    }
}

}

And here’s the main_activity.xml :

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/fragment_container_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

</layout>

Here’s the fragment I’m trying to add MessagesFragment.kt :

class MessagesFragment : Fragment() {

    private lateinit var binding : MessagesFragmentBinding
    private val messagesViewModel: MessagesViewModel by viewModels()
    private val messagesAdapter = MessagesAdapter()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        setupView()
        setupRecycler()
    }

    private fun setupRecycler() {
        binding.messageListRecyclerView.adapter = messagesAdapter

        postponeEnterTransition()
        view?.doOnPreDraw { startPostponedEnterTransition() }
    }

    private fun setupView() {
        messagesViewModel.state.onEach {
            messagesAdapter.submitList(it.messages)
        }
    }
}

And it’s associated messages_fragment.xml :

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/messageListRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        tools:listitem="@layout/message_item" />

</FrameLayout>

>Solution :

You never have your fragment actually inflate the messages_fragment.xml file.

You’ll want to change your fragment to call the Fragment constructor that takes a LayoutRes:

class MessagesFragment : Fragment(R.layout.messages_fragment) {

That will ensure that your view is inflated – which is a prerequisite to onViewCreated() being called.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading