11package com .blankj .utilcode .util ;
22
33import android .content .Context ;
4+ import android .content .ContextWrapper ;
45import android .graphics .Color ;
56import android .graphics .PorterDuff ;
67import android .graphics .PorterDuffColorFilter ;
1415import android .support .annotation .LayoutRes ;
1516import android .support .annotation .NonNull ;
1617import android .support .annotation .StringRes ;
18+ import android .util .Log ;
19+ import android .view .Display ;
1720import android .view .LayoutInflater ;
1821import android .view .View ;
22+ import android .view .ViewGroup ;
23+ import android .view .WindowManager ;
1924import android .widget .TextView ;
2025import android .widget .Toast ;
2126
27+ import java .lang .reflect .Field ;
28+
2229/**
2330 * <pre>
2431 * author: Blankj
@@ -214,7 +221,6 @@ public static View showCustomLong(@LayoutRes final int layoutId) {
214221 public static void cancel () {
215222 if (sToast != null ) {
216223 sToast .cancel ();
217- sToast = null ;
218224 }
219225 }
220226
@@ -247,7 +253,7 @@ public void run() {
247253 sToast .setGravity (sGravity , sXOffset , sYOffset );
248254 }
249255 setBg (tvMessage );
250- sToast . show ();
256+ showToast ();
251257 }
252258 });
253259 }
@@ -264,11 +270,24 @@ public void run() {
264270 sToast .setGravity (sGravity , sXOffset , sYOffset );
265271 }
266272 setBg ();
267- sToast . show ();
273+ showToast ();
268274 }
269275 });
270276 }
271277
278+ private static void showToast () {
279+ if (Build .VERSION .SDK_INT == Build .VERSION_CODES .N_MR1 ) {
280+ try {
281+ Field field = View .class .getDeclaredField ("mContext" );
282+ field .setAccessible (true );
283+ field .set (sToast .getView (), new ApplicationContextWrapperForApi25 ());
284+ } catch (Throwable throwable ) {
285+ throwable .printStackTrace ();
286+ }
287+ }
288+ sToast .show ();
289+ }
290+
272291 private static void setBg () {
273292 if (sBgResource != -1 ) {
274293 final View toastView = sToast .getView ();
@@ -317,4 +336,67 @@ private static View getView(@LayoutRes final int layoutId) {
317336 (LayoutInflater ) Utils .getApp ().getSystemService (Context .LAYOUT_INFLATER_SERVICE );
318337 return inflate != null ? inflate .inflate (layoutId , null ) : null ;
319338 }
339+
340+ private static final class ApplicationContextWrapperForApi25 extends ContextWrapper {
341+
342+ ApplicationContextWrapperForApi25 () {
343+ super (Utils .getApp ());
344+ }
345+
346+ @ Override
347+ public Context getApplicationContext () {
348+ return this ;
349+ }
350+
351+ @ Override
352+ public Object getSystemService (@ NonNull String name ) {
353+ if (Context .WINDOW_SERVICE .equals (name )) {
354+ // noinspection ConstantConditions
355+ return new WindowManagerWrapper (
356+ (WindowManager ) getBaseContext ().getSystemService (name )
357+ );
358+ }
359+ return super .getSystemService (name );
360+ }
361+
362+ private static final class WindowManagerWrapper implements WindowManager {
363+
364+ private final WindowManager base ;
365+
366+ private WindowManagerWrapper (@ NonNull WindowManager base ) {
367+ this .base = base ;
368+ }
369+
370+ @ Override
371+ public Display getDefaultDisplay () {
372+ return base .getDefaultDisplay ();
373+ }
374+
375+ @ Override
376+ public void removeViewImmediate (View view ) {
377+ base .removeViewImmediate (view );
378+ }
379+
380+ @ Override
381+ public void addView (View view , ViewGroup .LayoutParams params ) {
382+ try {
383+ base .addView (view , params );
384+ } catch (BadTokenException e ) {
385+ Log .e ("WindowManagerWrapper" , e .getMessage ());
386+ } catch (Throwable throwable ) {
387+ Log .e ("WindowManagerWrapper" , "[addView]" , throwable );
388+ }
389+ }
390+
391+ @ Override
392+ public void updateViewLayout (View view , ViewGroup .LayoutParams params ) {
393+ base .updateViewLayout (view , params );
394+ }
395+
396+ @ Override
397+ public void removeView (View view ) {
398+ base .removeView (view );
399+ }
400+ }
401+ }
320402}
0 commit comments