在android项目中经常会遇到这样的需求,从底部弹出些选项之类的。实现起来有很多种方法,比如:popupwindow,或者干脆定义一个透明灰色背景的view充当cover,然后通过设置要显示内容的visibility属性及辅助动画来达到这样的效果。 但是,灰色的背景总是不能覆盖状态栏。而使用Dialog会达到全屏灰色背景的沉浸体验效果。但是,Dialog使用时宽度一般不是充满屏幕宽度的,我们接下来要解决这个问题。
<style name="bottom_dialog" parent="Theme.AppCompat.Dialog">
<item name="android:windowBackground">@color/transparent</item>
</style>
注意,windowBackground是显示内容区域的窗口的背景色,不是整个屏幕的背景色。 background也不能修改屏幕背景色,屏幕背景色可以通过下面的方式修改透明度。或者,自定义layout,并把layout高宽充满全屏幕,即可自己定义背景色。
使用上面的style,作为以后给AlertDialog的style。
我的需求是在屏幕底部显示内容,于是我定义BottomDialog.java:
public class BottomDialog {
private AlertDialog alertDialog;
public BottomDialog( AlertDialog alertDialog){
this.alertDialog = alertDialog;
if (null != alertDialog) {
init();
}
}
private void init(){
Window window = alertDialog.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE);
}
public void show(){
if (null != alertDialog){
alertDialog.show();
Window window = alertDialog.getWindow();
WindowManager.LayoutParams layoutParams = window.getAttributes();
window.setGravity(Gravity.BOTTOM);
layoutParams.width = window.getWindowManager().getDefaultDisplay().getWidth();
layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(layoutParams);
}
}
public void dismiss(){
if (null != alertDialog){
alertDialog.dismiss();
}
}
}
使用时:
if (commentDialog == null) {
commentDialog = new BottomDialog(
new AlertDialog.Builder(ArticleDetailActivity.this, R.style.bottom_dialog)
.setView(v_comment_input)
.create()
);
}
commentDialog.show();
这样dialog就可以宽度全屏显示在窗口底部了。而且dialog的view内可以完美适应输入框。
如果其他区域的透明灰色覆盖层不符合你的需求:
<style name="bottom_dialog_08" parent="bottom_dialog">
<item name="android:backgroundDimAmount">0.8</item>
</style>
<style name="bottom_dialog_06" parent="bottom_dialog">
<item name="android:backgroundDimAmount">0.6</item>
</style>
<style name="bottom_dialog_04" parent="bottom_dialog">
<item name="android:backgroundDimAmount">0.4</item>
</style>
修改android:backgroundDimAmount
属性,即可获取不同的透明度。
另外,直接继承“Theme.AppCompat.DialogWhenLarge
”样式,应该不需要再自定义宽度就能全屏。但是该style没有透明灰色的覆盖层,应该能通过加一个name="android:backgroundDimEnabled" true
解决。如果帮你解决了问题,可以通过留言通知我,谢谢。
<style name="bottom_dialog_08" parent="bottom_dialog">
<item name="android:backgroundDimAmount">0.8</item>
<item name="android:backgroundDimEnabled">true</item>
</style>