当前位置:网站首页>[原创]用代码dialog 高度 宽度无法屏幕屏幕问题
[原创]用代码dialog 高度 宽度无法屏幕屏幕问题
2022-06-30 20:31:00 【lozn】
不做笔记全给忘记了,因为百度都是不靠谱的答案,所以探索出来的东西还是发不出来笔记号
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);
}
包含修改状态栏颜色
@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);
}
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 三种对话框全屏的实现方法
/**
*
* 设置了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多设置一点
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上自定义状态栏颜色才会出现
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 问题。
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));
}
});
边栏推荐
- 《大厂面试》之JVM篇21问与答
- The Commission is so high that everyone can participate in the new programmer's partner plan
- Study on lumiprobe modified triphosphate biotin-11-utp
- MFC界面库BCGControlBar v33.0 - 桌面警报窗口、网格控件升级等
- SQL必需掌握的100个重要知识点:创建和操纵表
- centos——开启/关闭oracle
- 翻转链表II[翻转链表3种方式+dummyHead/头插法/尾插法]
- Binary search tree (1) - concept and C language implementation
- Jerry's touch key recognition process [chapter]
- Label Contrastive Coding based Graph Neural Network for Graph Classification
猜你喜欢

PHP require/include differences

Lambda expression principle analysis and learning (June 23, 2022)

Testing principle and precautions of biovendor rage ELISA Kit

左值引用和右值引用

maya房子建模

Golang应用 ━━ 安装、配置与使用hugo博客系统

PHP获取Opcode及C源码

Wechat applet development practice cloud music

PHP require/include 区别

Maya house modeling
随机推荐
Go学习笔记
哈夫曼树(一)基本概念与C语言实现
【微服务~Nacos】Nacos之配置中心
Summary of personal work of 21 groups in the first week of summer training
Qt和其它GUI库的对比
Solve the problems of Devops landing in complex environment with various tools with full stack and full function solutions
Black apple server system installation tutorial, black apple installation tutorial, teach you how to install black apple in detail [easy to understand]
MySQL简介、详细安装步骤及使用 | 黑马程序员
By analyzing more than 7million R & D needs, it is found that these eight programming languages are the most needed by the industry
翻转链表II[翻转链表3种方式+dummyHead/头插法/尾插法]
PHP obtains opcode and C source code
Lumiprobe 改性三磷酸盐丨生物素-11-UTP研究
在线教育项目用户登录和注册
Mistakes the project manager should not make
基于开源流批一体数据同步引擎ChunJun数据还原—DDL解析模块的实战分享
阿里kube-eventer mysql sink简单使用记录
【数字IC应届生职业规划】Chap.1 IC行业产业链概述及代表企业大厂汇总
Jerry's touch key recognition process [chapter]
Lambda expression principle analysis and learning (June 23, 2022)
Basic components of STL