異常案例
項(xiàng)目中使用BottomSheetDialogFragment作為底部彈框,出現(xiàn)異常:
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:1003)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:387)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:96)
at android.app.Dialog.show(Dialog.java:344)
at androidx.fragment.app.DialogFragment.onStart(DialogFragment.java:436)
at com.steampy.app.activity.chat.messageitem.MessageItemNewDialog.onStart(MessageItemNewDialog.java:119)
at androidx.fragment.app.Fragment.performStart(Fragment.java:2477)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1494)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
異常多見于Diglog組件的使用中拋出。
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
if (getActivity() == null) {
return super.onCreateDialog(savedInstanceState);
}
return new BottomSheetDialog(getApplicationContext(),R.style.TransparentBottomSheetStyle); //這里必須getActivity
}
這里不能用getApplicationContext()
原因
導(dǎo)致報(bào)這個(gè)錯(cuò)是在于new BottomSheetDialog(mcontext),雖然這里的參數(shù)是BottomSheetDialog(Context context),但我們不能使用getApplicationContext()獲得的Context,而必須使用Activity,因?yàn)橹挥幸粋€(gè)Activity才能添加一個(gè)窗體。
解決方法
將new BottomSheetDialog(Context context)中的參數(shù)用 Activity.this(Activity是你的Activity的名稱)或者getActivity()來填充就可以正確的創(chuàng)建一個(gè)Dialog了。
-同樣的異常也經(jīng)常出現(xiàn)在AlertDialog等彈框出現(xiàn),都要傳遞ativity參數(shù).