22
33import android .annotation .SuppressLint ;
44import android .app .Activity ;
5+ import android .app .AlertDialog ;
6+ import android .app .Dialog ;
57import android .content .Context ;
8+ import android .content .DialogInterface ;
69import android .content .res .Configuration ;
710import android .content .res .Resources ;
811import android .graphics .Color ;
2427import android .view .Gravity ;
2528import android .view .LayoutInflater ;
2629import android .view .View ;
30+ import android .view .Window ;
2731import android .view .WindowManager ;
2832import android .widget .TextView ;
2933import android .widget .Toast ;
3034
35+ import com .blankj .utilcode .R ;
36+
3137import java .lang .reflect .Field ;
3238
3339/**
@@ -415,6 +421,7 @@ public void dispatchMessage(Message msg) {
415421
416422 static class ToastWithoutNotification extends AbsToast {
417423
424+ private Dialog mDialog ;
418425 private WindowManager mWM ;
419426 private View mView ;
420427
@@ -443,13 +450,26 @@ public void show() {
443450 mParams .y = mToast .getYOffset ();
444451 } else {
445452 Context topActivityOrApp = Utils .getTopActivityOrApp ();
446- if (topActivityOrApp instanceof Activity ) {
447- Activity topActivity = (Activity ) topActivityOrApp ;
453+ if (!(topActivityOrApp instanceof Activity )) {
454+ Log .e ("ToastUtils" , "Couldn't get top Activity." );
455+ return ;
456+ }
457+ Activity topActivity = (Activity ) topActivityOrApp ;
458+ if (topActivity .isFinishing () || topActivity .isDestroyed ()) {
459+ Log .e ("ToastUtils" , topActivity + " is useless" );
460+ return ;
461+ }
462+ if (topActivity .hasWindowFocus ()) {
448463 mWM = topActivity .getWindowManager ();
449- Utils .getActivityLifecycle ().addOnActivityDestroyedListener (topActivity , listener );
464+ mParams .type = WindowManager .LayoutParams .LAST_SUB_WINDOW ;
465+ mParams .y = mToast .getYOffset () + getNavBarHeight ();
466+ } else {
467+ mDialog = new Dialog (topActivity , R .style .DialogTransparent );
468+ mDialog .setContentView (mView );
469+ Window window = mDialog .getWindow ();
470+ mParams .y = mToast .getYOffset ();
450471 }
451- mParams .type = WindowManager .LayoutParams .TYPE_APPLICATION_PANEL ;
452- mParams .y = mToast .getYOffset () + getNavBarHeight ();
472+ Utils .getActivityLifecycle ().addOnActivityDestroyedListener (topActivity , listener );
453473 }
454474
455475 final Configuration config = context .getResources ().getConfiguration ();
@@ -479,9 +499,17 @@ public void show() {
479499 mParams .x = mToast .getXOffset ();
480500 mParams .packageName = Utils .getApp ().getPackageName ();
481501
482- try {
483- mWM .addView (mView , mParams );
484- } catch (Exception ignored ) { /**/ }
502+ if (mDialog != null ) {
503+ mDialog .getWindow ().setAttributes (mParams );
504+ mDialog .show ();
505+ } else {
506+ try {
507+ if (mWM != null ) {
508+ mWM .addView (mView , mParams );
509+ }
510+ } catch (Exception ignored ) { /**/ }
511+ }
512+
485513
486514 HANDLER .postDelayed (new Runnable () {
487515 @ Override
@@ -498,6 +526,10 @@ public void cancel() {
498526 mWM .removeViewImmediate (mView );
499527 }
500528 } catch (Exception ignored ) { /**/ }
529+ if (mDialog != null ) {
530+ mDialog .dismiss ();
531+ mDialog = null ;
532+ }
501533 mView = null ;
502534 mWM = null ;
503535 mToast = null ;
0 commit comments