Be careful when you use findFragmentByTag()

smoothdvd
1 min readApr 27, 2018

Recently I met NPE error reported by Crashlytics:

java.lang.NullPointerException: Attempt to invoke virtual method ‘void android.support.v4.app.Fragment.setNextAnim(int)’ on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

My activity has such lines like:

final FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (fragmentManager.findFragmentByTag("foo") == null) {
fooFragment = new FooFragment();
fragmentTransaction.add(R.id.root_container, fooFragment, "root");
} else {
fragmentTransaction.show(fooFragment);
}
fragmentTransaction.commit();

In some condition, Android system will kill process and activity will re-enter onCreate(), and then fooFragment will be null.

A simplified illustration of the activity lifecycle.

BUT, If you use findFragmentByTag method to retrieve a fragment, you will find the returned fragment IS NOT NULL!

In document from Android, it says:

Get fragments that exist in the activity, with findFragmentById() (for fragments that provide a UI in the activity layout) or findFragmentByTag() (for fragments that do or don't provide a UI).

So, just use findFragmentById() to correctly find fragment.

--

--