Home » Android » android – findFragmentById return null

android – findFragmentById return null

Posted by: admin April 23, 2020 Leave a comment

Questions:

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

The activity_main.xml

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

        <fragment android:name="com.madduck.test.app.fragment.MainFragment"
                  android:id="@+id/main_fragment"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent" />

        <fragment android:name="com.madduck.test.app.fragment.LoginFragment"
                  android:id="@+id/login_fragment"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent" />
</LinearLayout>

The MainActivity.java

private static final int LOGIN = 0;
private static final int MAIN = 1;
private static final int FRAGMENT_COUNT = MAIN +1;
private Fragment[] fragments = new Fragment[FRAGMENT_COUNT]

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fm = getSupportFragmentManager();
    fragments[LOGIN] = fm.findFragmentById(R.id.login_fragment);
    fragments[MAIN] = fm.findFragmentById(R.id.main_fragment);

    FragmentTransaction transaction = fm.beginTransaction();
    for (Fragment f : fragments) {
        if (f != null)
            transaction.hide(f);
        else
            Log.e(TAG, "???");
    }

    transaction.commit();
}

The thing is that when i call fm.findFragmentById(R.id.login_fragment); I get null but when I call fm.findFragmentById(R.id.main_fragment); I get the fragment.

How to&Answers:

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)

Answer:

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.

Answer:

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 

Answer:

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
   }