Android实现底部对话框BottomDialog弹出实例代码

发布时间 - 2026-01-11 00:15:47    点击率:

最近项目上需要实现一个底部对话框,要实现这样的功能其实很简单,先看代码:

private void show1() {
 Dialog bottomDialog = new Dialog(this, R.style.BottomDialog);
 View contentView = LayoutInflater.from(this).inflate(R.layout.dialog_content_normal, null);
 bottomDialog.setContentView(contentView);
 ViewGroup.LayoutParams layoutParams = contentView.getLayoutParams();
 layoutParams.width = getResources().getDisplayMetrics().widthPixels;
 contentView.setLayoutParams(layoutParams);
 bottomDialog.getWindow().setGravity(Gravity.BOTTOM);
 bottomDialog.getWindow().setWindowAnimations(R.style.BottomDialog_Animation);
 bottomDialog.show();
}

对话框的样式style:

<style name="BottomDialog" parent="@style/Base.V7.Theme.AppCompat.Light.Dialog">
 <item name="android:windowNoTitle">true</item>
 <item name="android:windowBackground">@android:color/transparent</item>
</style>

在对话框中的按钮需要MD风格的波纹效果的话,对话框的style的parent需要设定parent="@style/Base.V7.Theme.AppCompat.Light.Dialog",否则没有效果。同时将对话框所在window的标题去掉。android:windowBackground属性一定要设置成透明,否则自定义形状的对话框背景就是默认的白色了。如果不设置为透明,比如我们通常要设置的圆角对话框就没有效果。

对话框显示时从底部进入,关闭时从底部滑出。动画样式:

<style name="BottomDialog.Animation" parent="Animation.AppCompat.Dialog">
 <item name="android:windowEnterAnimation">@anim/translate_dialog_in</item>
 <item name="android:windowExitAnimation">@anim/translate_dialog_out</item>
</style>

tranlate_dialog_in.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:duration="300"
   android:fromXDelta="0"
   android:fromYDelta="100%"
   android:toXDelta="0"
   android:toYDelta="0">
</translate>

tranlate_dialog_out.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:duration="300"
   android:fromXDelta="0"
   android:fromYDelta="0"
   android:toXDelta="0"
   android:toYDelta="100%">
</translate>

实现底部对话框的原理就是修改对话框的内容布局contentView的参数,使它的宽度刚好等于屏幕的宽度,并且设置对话框所在Window的gravity属性为bottom。

需要注意的是,上面代码中需要在调用contentView.getLayoutParams()需要在setContentView方法后,否则获取到的LayoutParams为null,当然也可以自己new一个LayoutParams设置给contentView。


如果是要实现底部圆角对话框,原理也相似,只需要给contentView添加一个圆角的背景shape,并减小contentView的宽度给左右两边留一定的距离,同时给底部设置边距。

private void show2() {
 Dialog bottomDialog = new Dialog(this, R.style.BottomDialog);
 View contentView = LayoutInflater.from(this).inflate(R.layout.dialog_content_circle, null);
 bottomDialog.setContentView(contentView);
 ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) contentView.getLayoutParams();
 params.width = getResources().getDisplayMetrics().widthPixels - DensityUtil.dp2px(this, 16f);
 params.bottomMargin = DensityUtil.dp2px(this, 8f);
 contentView.setLayoutParams(params);
 bottomDialog.getWindow().setGravity(Gravity.BOTTOM);
 bottomDialog.getWindow().setWindowAnimations(R.style.BottomDialog_Animation);
 bottomDialog.show();
}

 源码:BottomDialog_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# dialog底部弹出  # android  # 底部对话框  # bottomdialog  # Android中自定义对话框(Dialog)的实例代码  # Android自定义对话框Dialog的简单实现  # 详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限  # Android实现点击AlertDialog上按钮时不关闭对话框的方法  # 实例详解Android自定义ProgressDialog进度条对话框的实现  # Android 之BottomsheetDialogFragment仿抖音评论底部弹出对话框效果(实  # Android实现退出界面弹出提示对话框  # Android中AlertDialog各种对话框的用法实例详解  # Android仿QQ消息提示实现弹出式对话框  # Android对话框使用方法详解  # 对话框  # 圆角  # 的是  # 只需  # 就没  # 自定义  # 要给  # 设置为  # 使它  # 需要注意  # 先看  # 大家多多  # 设置成  # 其实很简单  # 滑出  # 对话框中  # BOTTOM  # BottomDialog_Animation  # show  # setGravity 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 公司网站制作价格怎么算,公司办个官网需要多少钱?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Bootstrap CSS布局之列表  Python文件异常处理策略_健壮性说明【指导】  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  IOS倒计时设置UIButton标题title的抖动问题  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Android使用GridView实现日历的简单功能  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  javascript中对象的定义、使用以及对象和原型链操作小结  C++时间戳转换成日期时间的步骤和示例代码  如何快速建站并高效导出源代码?  如何在万网利用已有域名快速建站?  如何用已有域名快速搭建网站?  Laravel怎么在Blade中安全地输出原始HTML内容  香港服务器网站卡顿?如何解决网络延迟与负载问题?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Laravel怎么调用外部API_Laravel Http Client客户端使用  网站页面设计需要考虑到这些问题  Python数据仓库与ETL构建实战_Airflow调度流程详解  如何快速生成ASP一键建站模板并优化安全性?  高端企业智能建站程序:SEO优化与响应式模板定制开发  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  图册素材网站设计制作软件,图册的导出方式有几种?  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  如何在云主机上快速搭建多站点网站?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  网站图片在线制作软件,怎么在图片上做链接?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  高端网站建设与定制开发一站式解决方案 中企动力  如何实现建站之星域名转发设置?  潮流网站制作头像软件下载,适合母子的网名有哪些?  如何在阿里云服务器自主搭建网站?  如何快速搭建高效简练网站?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  详解阿里云nginx服务器多站点的配置  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何在云主机快速搭建网站站点?  网站优化排名时,需要考虑哪些问题呢?  如何用腾讯建站主机快速创建免费网站?  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧