вы не можете использовать «getApplicationContext ()» для создания нового AlertDialog, вы должны прикрепить контекст действия к новому AlertDialog, потому что
Dialog(@NonNull Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) {
// something not important
mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
final Window w = new PhoneWindow(mContext);
mWindow = w;
w.setCallback(this);
w.setOnWindowDismissedCallback(this);
w.setWindowManager(mWindowManager, null, null);
w.setGravity(Gravity.CENTER);
mListenersHandler = new ListenersHandler(this);
}
здесь новая функция Dialog () будет использоватьконтекст для нового mWindowManager, когда вы используете show ()
public void show() {
// something not important
mDecor = mWindow.getDecorView();
WindowManager.LayoutParams l = mWindow.getAttributes();
if ((l.softInputMode
& WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {
WindowManager.LayoutParams nl = new WindowManager.LayoutParams();
nl.copyFrom(l);
nl.softInputMode |=
WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
l = nl;
}
try {
mWindowManager.addView(mDecor, l);
mShowing = true;
sendShowMessage();
} finally {
}
}
, здесь mWindowManager требует addView, но если контекст является applicationContext, токен mWindowManager будет нулевым.если контекст является активностью, активность свяжет свой токен с mWindowManager, он может работать хорошо.