解决windowIsTranslucent 属性导致的debug
因项目原因,加入了右滑退出的库,使用此类库都必须在style文件里加入
<item name="android:windowIsTranslucent">true</item>
属性,因此属性导致了无数问题,现就一个突出问题提出解决方案。 如何快速集成 右滑退出,请看我的另一篇博客:https://blog.csdn.net/w13576267399/article/details/77238251
遇到问题和解决方案如下:
- 为了达到Dialog/PopupWindow弹出变暗效果,我想到了通过给 activity 添加窗体透明度来实现,代码如下
/**
* window背景是否变暗
*
* @param isDark
*/
public void setDarkWindow(boolean isDark) {
Window window = getWindow();
// 设置窗口里控件的透明度的.0.0全透明.1.0不透明.
WindowManager.LayoutParams wl = window.getAttributes();
wl.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
if (isDark) {
wl.alpha = 0.6f;
} else {
wl.alpha = 1.0f;
}
}
2.在使用 windowIsTranslucent 之前,这样做是没有问题的,使用之后,再此弹出dialog时,会意外的发现activity会半透明的显示上一个activity的内容。我认为是这样的:windowIsTranslucent属性会使activity变得半透明,当我们设置了背景颜色时,这个半透明时看不出来的。但当我们设置窗体透明度时,连背景颜色都半透明了,自然会因为这个属性而看到上一层activity。在这里,我的目标是:1.保留右滑退出。2.实现Dialog/PopupWindow弹出背景变暗效果
3.解决方案如下:
既然右滑退出必须要实现 windowIsTranslucent 属性,那我们就从 dialog 弹出背景变暗的方式入手,我想到了通过给根布局添加一个 View ,给这个 View 设置透明度,在需要的时候显示出来,平时隐藏。下面是我的做法:
/**
* 半透明窗体,给Dialog实现背景变暗效果
*/
public View mDialogView=null;
/**
* 根布局
*/
private FrameLayout rootView = null;
//首先获得根布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View decorView = getWindow().getDecorView();
rootView = (FrameLayout) decorView.findViewById(android.R.id.content);
}
/**
* window背景是否变暗
*
* @param isDark
*/
public void setDarkWindow(boolean isDark) {
//添加一个半透明的view
if (mDialogView==null) {
mDialogView = new View(this);
//设置宽高为全屏
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams
(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
mDialogView.setLayoutParams(layoutParams);
mDialogView.setVisibility(View.VISIBLE);
//设置背景颜色为黑色,加上透明度,就会有半透明的黑色蒙版效果
mDialogView.setBackgroundColor(getResources().getColor(R.color.black));
//1.0f 不透明/0.0f 透明
mDialogView.setAlpha(0.6f);
rootView.addView(mDialogView);
}
// 通过显示隐藏的方式来产生背景变暗效果
if (isDark){
mDialogView.setVisibility(View.VISIBLE);
}else{
mDialogView.setVisibility(View.GONE);
}
}
4.完美解决,大家使用 windowIsTranslucent 属性来解决黑白屏启动或者使用右滑退出时要注意,会出现很多意向不到的bug,还会导致生命周期 onStop 不会回调(建议onStop里的操作放到 onPause 中)。希望就此方案能帮助同样遇到此问题的小伙伴,帮到的话给点个赞吧!