findFragmentById return null

后端 未结 5 1101
时光取名叫无心
时光取名叫无心 2020-12-09 15:01

When i call findFragmentById() with the id of my fragment, it return null. Let me show you the code.

The activity_main.xml



        
相关标签:
5条回答
  • 2020-12-09 15:19

    Kotlin

    I also had problem because I was in a child fragment. I could use:

        supportFragmentManager.fragments.forEach {
            it.childFragmentManager.fragments.forEach { fragment ->
                if (fragment is HomeFragment) {
                    //do something
                } 
            }
    

    but one coworker optimized it with :

         if( findNavController(R.id.nav_host_fragment).currentDestination?.id == R.id.homeFragment) {
           // do something
       }
    
    0 讨论(0)
  • 2020-12-09 15:20

    Not really related to the specific question but related to receiving null on findFragmentById, if you call findFragmentById immediately after commit it will return null or the last fragment(before commit), the reason because commit do async request.

    From docs:

    Schedules a commit of this transaction. The commit does not happen immediately; it will be scheduled as work on the main thread to be done the next time that thread is ready.

    If you need to findFragmentById immediately, for example change status bar text color after adding fragment, call executePendingTransactions() after commit()

    getSupportFragmentManager().executePendingTransactions();
    //call findFragmentById 
    
    0 讨论(0)
  • 2020-12-09 15:25

    just found out my mistake.

    In my MainActivity.java i was importing android.support.v4.app.Fragment; and in my LoginFragment.java i was importing android.app.Fragment;. I changed it to the same thing and fm.findFragmentById(R.id.login_fragment) now return the right fragment.

    0 讨论(0)
  • 2020-12-09 15:42

    The answer Kar0t is perfectly fine but this may help somebody. On my case I had a fragment inside of a fragment and I was getting the wrong FragmentManager. I just had to call:

    getChildFragmentManager()

    and then just find the Fragment as usual:

    fm.findFragmentById(R.id.fragment)
    
    0 讨论(0)
  • 2020-12-09 15:44

    I encountered this problem because my project has two layout with the same file name. eg. In your case, I have two activity_main.xml in different modules.

    So somehow it get compiled and when you run

    fm.findFragmentById(R.id.login_fragment)

    then it is looking for the fragment in the other activity_main.xml, which is null.

    If this is the case, just check your file names of layouts, make sure they are unique.

    Hope this help anyone with the same issue as mine. :)

    0 讨论(0)
提交回复
热议问题