Search code examples
androidnullpointerexceptiononresumedialogfragment

NullPointerException on DialogFragment at onResume()


I have a a DialogFragment that has this particular onResume code to handle the back press. Unfortunately my code keeps generating that NullPointerException (I'm catching it) but I don't know why it's happening. This happens every time the DialogFragment is opened. Thanks for the input on this particular case.

@Override
public void onResume() 
{
    super.onResume();

    try
    {
        getDialog().setOnKeyListener(new OnKeyListener()
        {
            @Override
            public boolean onKey(android.content.DialogInterface dialog, int keyCode,android.view.KeyEvent event) 
            {
                if ((keyCode == android.view.KeyEvent.KEYCODE_BACK)) 
                {
                    dismiss();
                    return true;
                }
                else return false; 
            }
        });
    }
    catch(NullPointerException e)
    {
        Log.w("NullPointerException", "HealthRecords.java : onResume()",e);
    }
}

My LogCat Error:

01-21 15:47:20.266: W/NullPointerException(17010): HealthRecords.java : onResume()
01-21 15:47:20.266: W/NullPointerException(17010): java.lang.NullPointerException
01-21 15:47:20.266: W/NullPointerException(17010):  at digitalbeef.com.home.HealthRecords.onResume(HealthRecords.java:132)
01-21 15:47:20.266: W/NullPointerException(17010):  at android.app.Fragment.performResume(Fragment.java:1743)
01-21 15:47:20.266: W/NullPointerException(17010):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:924)
01-21 15:47:20.266: W/NullPointerException(17010):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
01-21 15:47:20.266: W/NullPointerException(17010):  at android.app.BackStackRecord.run(BackStackRecord.java:684)
01-21 15:47:20.266: W/NullPointerException(17010):  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1453)
01-21 15:47:20.266: W/NullPointerException(17010):  at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
01-21 15:47:20.266: W/NullPointerException(17010):  at android.os.Handler.handleCallback(Handler.java:733)
01-21 15:47:20.266: W/NullPointerException(17010):  at android.os.Handler.dispatchMessage(Handler.java:95)
01-21 15:47:20.266: W/NullPointerException(17010):  at android.os.Looper.loop(Looper.java:136)
01-21 15:47:20.266: W/NullPointerException(17010):  at android.app.ActivityThread.main(ActivityThread.java:5479)
01-21 15:47:20.266: W/NullPointerException(17010):  at java.lang.reflect.Method.invokeNative(Native Method)
01-21 15:47:20.266: W/NullPointerException(17010):  at java.lang.reflect.Method.invoke(Method.java:515)
01-21 15:47:20.266: W/NullPointerException(17010):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
01-21 15:47:20.266: W/NullPointerException(17010):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
01-21 15:47:20.266: W/NullPointerException(17010):  at dalvik.system.NativeStart.main(Native Method)

Solution

  • It's probably because onResume is called before onCreateDialog. Therefore getDialog returns null.

    What you want to do is to set the listener once the dialog is created, or even when it's created:

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
            @Override
            public boolean onKey(android.content.DialogInterface dialog, int keyCode,
                                 android.view.KeyEvent event) {
                if ((keyCode == android.view.KeyEvent.KEYCODE_BACK)) {
                    dismiss();
                    return true;
                } else {
                    return false;
                }
            }
        });
    
        return dialog;
    }