简书链接:原创用代码dialog高度宽度无法屏幕屏幕问题  文章字数:741,阅读全文大约需要2分钟 不做笔记全给忘记了,因为百度都是不靠谱的答案,所以探索出来的东西还是发不出来笔记号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  public static <T extends ViewDataBinding> Pair<Dialog,T> getDialog(Context context, @LayoutRes int layout, Class<T> parent_, ViewGroup viewGroup) {         Dialog dialog = new Dialog(context);         Window window = dialog.getWindow();         WindowManager.LayoutParams lp = window.getAttributes();         window.getDecorView().setPadding(0, 0, 0, 0);         lp.dimAmount = 0;//dimAmount在0.0f和1.0f之间,0.0f完全不暗,1.0f全暗         lp.width = ViewGroup.LayoutParams.MATCH_PARENT;         lp.height = ViewGroup.LayoutParams.MATCH_PARENT;         lp.gravity = Gravity.TOP;         dialog.getWindow().setAttributes(lp);         dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));                  dialog.getWindow().setBackgroundDrawable(null);         T dataBinding = DataBindingUtil.inflate(LayoutInflater.from(context),layout, viewGroup, false); //        dialog.getWindow().setBackgroundDrawableResource(android.R.color.white);         /*            <item name="android:windowFrame">@null</item>         <item name="android:windowIsFloating">true</item>         <item name="android:windowIsTranslucent">false</item>         <item name="android:windowNoTitle">true</item>         <item name="android:windowBackground">@android:color/white</item>         <item name="android:backgroundDimEnabled">true</item>          */         dialog.setContentView(dataBinding.getRoot());         dialog.setCanceledOnTouchOutside(true);         return new Pair<>(dialog,dataBinding);     } 
 
包含修改状态栏颜色
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35   @SuppressLint("WrongConstant")     public static <T extends ViewDataBinding> Pair<Dialog,T> getDialog(Context context, @LayoutRes int layout, Class<T> parent_, ViewGroup viewGroup) {         Dialog dialog = new Dialog(context);         Window window = dialog.getWindow();         WindowManager.LayoutParams lp = window.getAttributes();         if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0 全透明实现             window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                     | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);             window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);             window.setStatusBarColor(AppContext.getInstance().getResources().getColor(R.color.themeColor));             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {                 lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT; //                lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;             }         } else {//4.4 全透明状态栏 //            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//不需要透明         }         window.getDecorView().setPadding(0, window.getDecorView().getPaddingTop(), 0, 0);         lp.dimAmount = 0;//dimAmount在0.0f和1.0f之间,0.0f完全不暗,1.0f全暗         lp.width = ViewGroup.LayoutParams.MATCH_PARENT;         lp.height = ViewGroup.LayoutParams.MATCH_PARENT;         lp.gravity = Gravity.BOTTOM;         dialog.getWindow().setAttributes(lp);         dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.WHITE));         T dataBinding = DataBindingUtil.inflate(LayoutInflater.from(context),layout, viewGroup, false);         dialog.setContentView(dataBinding.getRoot());         dialog.setCanceledOnTouchOutside(true);         return new Pair<>(dialog,dataBinding);     } 
 
1 2 3 4 5 6 7 8 9 10 11 public static void setTranslucentStatus(Activity activity) {     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0 全透明实现         Window window = activity.getWindow();         window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);         window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);         window.setStatusBarColor(Color.TRANSPARENT);     } else {//4.4 全透明状态栏         activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);     } } 
 
后面pad遇到了一些问题  下面3 三种对话框全屏的实现方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129     /**      *       * 设置了View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 状态栏为白色,字体为黑色 pad上也无bug,自动padding状态栏  SYSTEM_UI_FLAG_HIDE_NAVIGATION 解决pad 导航栏透明看不见以及布局延伸到状态栏问题,但是需要解决一个问题。状态栏变指定颜色      * @param context      * @param layout      * @param parent_ 只是用来防止强转的麻烦      * @param viewGroup      * @param <T>      * @return      */     @SuppressLint("WrongConstant")     public static <T extends ViewDataBinding> Pair<Dialog,T> getDialog(Context context, @LayoutRes int layout, Class<T> parent_, ViewGroup viewGroup) {         Dialog dialog = new Dialog(context);         Window window = dialog.getWindow();         WindowManager.LayoutParams lp = window.getAttributes();         //如果不高亮 就去掉    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR         if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0 全透明实现             window.getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);// View.SYSTEM_UI_FLAG_LAYOUT_STABLE|             window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);//不设置无法修改状态栏颜色,但是能解决pad上布局被延到状态栏问题             window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS );//如果要设置栏颜色自定义必须没有设置 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 不设置状态栏将变成透明自定义颜色设置无效[pad已验证]            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//如果要设置栏颜色自定义必须没有设置 ,SYSTEM_UI_FLAG_LAYOUT_STABLE可有可无。             window.setStatusBarColor(AppContext.getInstance().getResources().getColor(R.color.themeColor));             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { //                lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT; //                lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;             } //https://www.jianshu.com/p/50d2024fa60a         } else {//4.4 全透明状态栏             window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//不需要透明         }         window.getDecorView().setPadding(0, 0, 0, 0);         lp.dimAmount = 0;//dimAmount在0.0f和1.0f之间,0.0f完全不暗,1.0f全暗         lp.width = ViewGroup.LayoutParams.MATCH_PARENT;         lp.height = ViewGroup.LayoutParams.MATCH_PARENT;         lp.gravity = Gravity.BOTTOM;         dialog.getWindow().setAttributes(lp);         dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.WHITE));         T dataBinding = DataBindingUtil.inflate(LayoutInflater.from(context),layout, viewGroup, false);         dialog.setContentView(dataBinding.getRoot());         dialog.setCanceledOnTouchOutside(true);         return new Pair<>(dialog,dataBinding);     }     /**      * 在pad 布局会衍生到状态栏,需要手动处理 给状态栏高度填充自己的一块任意颜色view.      * @param context      * @param layout      * @param parent_      * @param viewGroup      * @param <T>      * @return      */     public static <T extends ViewDataBinding> Pair<Dialog,T> getFullDialog(Context context, @LayoutRes int layout, Class<T> parent_, ViewGroup viewGroup) { //全屏对话框 https://blog.csdn.net/qijingwang/article/details/118368281         AppCompatDialog dialog = new AppCompatDialog(context, R.style.ThemeOverlay_AppCompat_Dialog);         dialog.supportRequestWindowFeature(Window.FEATURE_NO_TITLE);         T dataBinding = DataBindingUtil.inflate(LayoutInflater.from(context),layout, viewGroup, false);         dialog.setContentView(dataBinding.getRoot());         Window window = dialog.getWindow();         window.getDecorView().setFitsSystemWindows(true);         window.getDecorView().setPadding(0,0, 0, 0);//不设置虽然是白色背景,但是无法铺满。         WindowManager.LayoutParams lp = window.getAttributes();         lp.width = ViewGroup.LayoutParams.MATCH_PARENT;         lp.height = ViewGroup.LayoutParams.MATCH_PARENT;         lp.gravity = Gravity.BOTTOM;         dialog.getWindow().setAttributes(lp);         dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.WHITE));         dialog.setCanceledOnTouchOutside(true);         modifyDialogStatusBar(dialog,AppContext.getInstance().getResources().getColor(R.color.themeColor));         //修改参数属性必须设置在后面,但是虽然全屏了,但是状态栏颜色变了         return new Pair<>(dialog,dataBinding);     }     @SuppressLint("WrongConstant")     public static void modifyDialogStatusBar(Dialog dialog, @ColorInt int color){         if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0 全透明实现             Window window = dialog.getWindow(); //            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);             //decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); 状态栏宝妞 如果不加SYSTEM_UI_FLAG_LAYOUT_STABLE直接全屏。状态栏遮盖             //布局衍生到导航栏 .SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION             window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);             window.setStatusBarColor(color); //            window.setStatusBarColor(color);             WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { //                lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT; //                lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;//这导致状态栏变白色不会变成默认修改的颜色, ,导致上面设置的颜色无效,             }             dialog.getWindow().setAttributes(lp);         } else {//4.4 全透明状态栏             dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);         }     }     /**      * 这种方式全屏有缺陷,会导致很容易滑动下来      * @param context      * @param layout      * @param parent_      * @param viewGroup      * @param <T>      * @return      */     public static <T extends ViewDataBinding> Pair<Dialog,T> getBottomSheetFullDialog(Context context, @LayoutRes int layout, Class<T> parent_, ViewGroup viewGroup) {         BottomSheetDialog dialog = new BottomSheetDialog(context){             @Override             public void show() {                 super.show();                 View mContent = getWindow().getDecorView().findViewById(R.id.design_bottom_sheet);                 ViewGroup.LayoutParams orginLayoutParams = mContent.getLayoutParams();                 orginLayoutParams.height=ViewGroup.LayoutParams.MATCH_PARENT;                 mContent.setLayoutParams(orginLayoutParams);                 BottomSheetBehavior<View> from = BottomSheetBehavior.from(mContent);                 from.setState(BottomSheetBehavior.STATE_EXPANDED);             }         };         Window window = dialog.getWindow();         WindowManager.LayoutParams lp = window.getAttributes();         dialog.getWindow().setAttributes(lp);         T dataBinding = DataBindingUtil.inflate(LayoutInflater.from(context),layout, viewGroup, false);         dialog.setContentView(dataBinding.getRoot());         dialog.setCanceledOnTouchOutside(true);         return new Pair<>(dialog,dataBinding);     } 
 
pad上状态栏被填充的问题 如果是toolbar,那就把toolbar的padding多设置一点
1 2 3 4 5 6 7     int[] position=new int[2];                 dialogPair.second.getRoot().getLocationOnScreen(position);                 if (position[0] == 0) {                     int statusBarHeight = AppUtils.getStatusBarHeight(getThis()); //                    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);                     dialogPair.second.toolbar.setPadding(0,statusBarHeight,0,0);//处理pad 布局填充到状态栏问题                 } 
 
或者自定义一个view到状态栏 这个问题只有在pad上自定义状态栏颜色才会出现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 int[] position = new int[2];                 dataBinding.getRoot().getLocationOnScreen(position);                 if (position[0] == 0) {                     int statusBarHeight = AppUtils.getStatusBarHeight(getThis());                     FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);                     params.topMargin = statusBarHeight;                     View view = new View(dataBinding.getRoot().getContext());                     view.setBackgroundColor(getThis().getResources().getColor(R.color.themeColor));                     ViewGroup viewGroup = (ViewGroup) dataBinding.getRoot();                     viewGroup.addView(view, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, AppUtils.getStatusBarHeight(getThis())));                     dataBinding.nestedScrollView.setPadding(0,statusBarHeight,0,0);//解决直接到顶问题。                     dataBinding.btnClose.setPadding(dataBinding.btnClose.getPaddingLeft(),dataBinding.btnClose.getPaddingTop()+statusBarHeight,dataBinding.btnClose.getPaddingRight(),dataBinding.btnClose.getPaddingBottom());                 } 
 
上面修复状态栏代码在show之后使用
上面代码使用x y为0 这就解决了getLocationOnScreen()获取时机不对导致为0 问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 dataBinding.getRoot().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {                 @Override                 public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {                     int[] position = new int[2];                     dataBinding.getRoot().getLocationOnScreen(position);                         int statusBarHeight = position[1] == 0?AppUtils.getStatusBarHeight(getThis()):0;                         FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);                         params.topMargin = statusBarHeight;                         View view = new View(dataBinding.getRoot().getContext());                         view.setBackgroundColor(getThis().getResources().getColor(R.color.themeColor));                         ViewGroup viewGroup = (ViewGroup) dataBinding.getRoot();                         viewGroup.addView(view, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, AppUtils.getStatusBarHeight(getThis())));                         dataBinding.nestedScrollView.setPadding(0, statusBarHeight, 0, 0);//解决直接到顶问题。                         dataBinding.btnClose.setPadding(dataBinding.btnClose.getPaddingLeft(), dataBinding.btnClose.getPaddingTop() + statusBarHeight, dataBinding.btnClose.getPaddingRight(), dataBinding.btnClose.getPaddingBottom());                     Log.w("XY", Arrays.toString(position));                 }             });