2016-05-20 140 views
-1

當我嘗試解散FragmentDialog時,我的應用程序有時會崩潰。
這裏的日誌:NullPointerException:試圖調用虛擬方法'android.app.FragmentTransaction android.app.FragmentManager.beginTransaction()'

Process: com.xxx, PID: 9981 
java.lang.RuntimeException: Error receiving broadcast Intent { act=xxxx flg=0x10 (has extras) } in xxxxxx 
    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:893) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5438) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.FragmentTransaction android.app.FragmentManager.beginTransaction()' on a null object reference 
    at android.app.DialogFragment.dismissInternal(DialogFragment.java:296) 
    at android.app.DialogFragment.dismissAllowingStateLoss(DialogFragment.java:277) 
    at xxxxx.updateStatus(BaseAppCompatActivity.java:96) 
    at xxxxx.access$000(BaseAppCompatActivity.java:43) 
    at xxxxx$1.onReceive(BaseAppCompatActivity.java:79) 
    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:883) 

xxxxx.updateStatus(BaseAppCompatActivity.java:96)
此行是試圖駁回DialogFragment:

mDialogFragment.dismissAllowingStateLoss(); 


一個DialogFragment是在我的活動。

private SimpleBlockedDialogFragment mDialogFragment = SimpleBlockedDialogFragment.newInstance(); 

因此mDialogFragment不爲空。

我顯示的對話框是這樣的:

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
mDialogFragment.updateMessage("xxx"); 
mDialogFragment.show(ft, "block_dialog"); 

並關閉對話框如下:

mDialogFragment.dismissAllowingStateLoss(); 

有時候,我會告訴對話框只有一次,但駁回了不止一次。但我不認爲這會導致崩潰。

這裏是在DialogFragment的dismissInternal功能:

void dismissInternal(boolean allowStateLoss) { 
    if (mDismissed) { 
     return; 
    } 
    mDismissed = true; 
    mShownByMe = false; 
    if (mDialog != null) { 
     mDialog.dismiss(); 
     mDialog = null; 
    } 
    mViewDestroyed = true; 
    if (mBackStackId >= 0) { 
     getFragmentManager().popBackStack(mBackStackId, 
       FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     mBackStackId = -1; 
    } else { 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.remove(this); 
     if (allowStateLoss) { 
      ft.commitAllowingStateLoss(); 
     } else { 
      ft.commit(); 
     } 
    } 
} 

日誌告訴我,getFragmentManager()返回NULL。我不知道爲什麼會發生這種情況。
如何正確關閉FragmentDialog?

更新:
我嘗試android.support.v4.app.FragmentTransaction,而且還得到一個異常。

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentTransaction android.support.v4.app.FragmentManager.beginTransaction()' on a null object reference 
    at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:196) 
    at android.support.v4.app.DialogFragment.dismissAllowingStateLoss(DialogFragment.java:177) 

幫助〜

+4

可能重複[什麼是空指針異常,以及如何解決它?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how -do-i-fix-it) –

+0

@LonnieZamora這個NullPointerException發生在android框架中。 –

+1

是什麼讓你這麼想? –

回答

1

嘗試getSupportFragmentManager().beginTransaction();這可能會有幫助。

+0

謝謝,我會盡力的。但爲什麼我使用android.support.v4.app.FragmentTransaction而不是android.app.FragmentTransaction? –

相關問題