android自定义Dialog实现底部弹窗

拿到这个需求,很多人都是直接想用popWindow 实现,但是这样的效果我们完全可以根据系统的Dialog 自定义一个。

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

builder.setTitle("SSS");

builder.show();

这样就直接显示出一个对话框,但是,这个对话框在屏幕的中间,然后,我们去查看dialog的源码:

看dialog.show()里面判断了是否正在显示中,并没有和根布局有关系,看这个类的父类。里面的show()中:

public void show() {

if (mShowing) {

if (mDecor != null) {

if (mWindow.hasFeature(Window.FEATURE_ACTION_BAR)) {

mWindow.invalidatePanelMenu(Window.FEATURE_ACTION_BAR);

}

mDecor.setVisibility(View.VISIBLE);

}

return;

}

mCanceled = false;

if (!mCreated) {

dispatchOnCreate(null);

} else {

// Fill the DecorView in on any configuration changes that

// may have occured while it was removed from the WindowManager.

final Configuration config = mContext.getResources().getConfiguration();

mWindow.getDecorView().dispatchConfigurationChanged(config);

}

onStart();

mDecor = mWindow.getDecorView();

if (mActionBar == null && mWindow.hasFeature(Window.FEATURE_ACTION_BAR)) {

final ApplicationInfo info = mContext.getApplicationInfo();

mWindow.setDefaultIcon(info.icon);

mWindow.setDefaultLogo(info.logo);

mActionBar = new WindowDecorActionBar(this);

}

WindowManager.LayoutParams l = mWindow.getAttributes();

if ((l.softInputMode

& WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {

WindowManager.LayoutParams nl = new WindowManager.LayoutParams();

nl.copyFrom(l);

nl.softInputMode |=

WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;

l = nl;

}

mWindowManager.addView(mDecor, l);

mShowing = true;

sendShowMessage();

}

这个调用addView 进去,我们Dialog就是这样加进去的;

可以看到Dialog的源码中的方法,也有onCreate( ) 他也是初始化 对话框的

/**

* Similar to {@link Activity#onCreate}, you should initialize your dialog

* in this method, including calling {@link #setContentView}.

* @param savedInstanceState If this dialog is being reinitialized after a

* the hosting activity was previously shut down, holds the result from

* the most recent call to {@link #onSaveInstanceState}, or null if this

* is the first time.

*/

protected void onCreate(Bundle savedInstanceState) {

}

看Dialog 的实现类。里面有个日期弹窗的实现类,效果如下,更多时间筛选的对话框可以看我的另一个自定义的 文章:

系统的效果如下:

[图片上传失败...(image-ceb45e-1511342382391)]

自定义Dialog实现

1.创建一个自定义类继承dialog类,创建布局,当成Activity 重写onCreate()看效果

public class SmartDialog extends Dialog {

public SmartDialog(@NonNull Context context) {

super(context);

}

public SmartDialog(@NonNull Context context, @StyleRes int themeResId) {

super(context, themeResId);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.smartlayout);

}

}

布局文件:

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:layout_width="match_parent"

android:layout_margin="10dp"

android:layout_height="wrap_content"

android:id="@+id/title"

android:text="自定义风格弹窗"

/>

android:id="@+id/listView"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

点击事件调用:

SmartDialog smartDialog = new SmartDialog(DialogShowActivity.this);

smartDialog.setTitle("我是Title");

smartDialog.show();

image.png

设置View的 属性,让弹窗到底部

requestWindowFeature(Window.FEATURE_NO_TITLE);//事情定需不需要加

setContentView(R.layout.smartlayout);

WindowManager.LayoutParams params = getWindow().getAttributes();

if(params!=null){

//获取属性可能失败 为空

params.gravity= Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM;

getWindow().setAttributes(params);

}

image.png

更改布局,添加数据

这里我们简单做一个ListView

image.png

.显示效果你会发现没有完全填充,这个时候,再去看我们调用Dialog 默认的构造函数,

查看源码。更改style

public Dialog(@NonNull Context context) {

this(context, 0, true);

}

if (createContextThemeWrapper) {

if (themeResId == 0) {

final TypedValue outValue = new TypedValue();

context.getTheme().resolveAttribute(R.attr.dialogTheme, outValue, true);

themeResId = outValue.resourceId;

}

mContext = new ContextThemeWrapper(context, themeResId);

} else {

mContext = context;

}

如果走默认的构造就不显示,去SDK中找到 R.attr.dialogTheme 先找到自己对应版本的SDK 到自己项目 的build.gradle 中找到

进到自己的安装目录下找对于的 dialogTheme 发现只是定义了 类型,并没具体定义。然后去themes 里面找到:

@style/Theme.Dialog

@layout/dialog_title_icons

@layout/dialog_custom_title

@layout/dialog_title

@dimen/dialog_padding

因为并没有找到具体的定义属性,再去搜索 Theme.Dialog 去 style 中找下 没找到,发现这个文件就在 themes 中,如下:

@null

@style/DialogWindowTitle

@drawable/panel_background

true

@null

@style/Animation.Dialog

stateUnspecified|adjustPan

@bool/config_closeDialogWhenTouchOutside

true

@null

@style/TextAppearance

@style/TextAppearance.Inverse

@color/primary_text_dark

@color/secondary_text_dark

@color/tertiary_text_dark

@color/primary_text_light

@color/secondary_text_light

@color/tertiary_text_light

@color/primary_text_dark_disable_only

@color/primary_text_light_disable_only

@color/primary_text_dark_nodisable

@color/secondary_text_dark_nodisable

@color/primary_text_light_nodisable

@color/secondary_text_light_nodisable

@color/hint_foreground_dark

@color/hint_foreground_light

@color/search_url_text

@style/TextAppearance.Large

@style/TextAppearance.Medium

@style/TextAppearance.Small

@style/TextAppearance.Large.Inverse

@style/TextAppearance.Medium.Inverse

@style/TextAppearance.Small.Inverse

10dip

10dip

10dip

10dip

@style/PreferencePanel.Dialog

我们重点看这个属性: @drawable/panel_background

在资源文件中搜索这个panel_background,打开你会发现是一张 .9图片如下:

image.png

我们自己在项目中实现一个style 去重写这个background 属性,去覆盖

@android:color/white

然后在代码中去使用就直接多传递一个参数去设置:

public Smartdialog(@NonNull Context context) {

super(context,R.style.MtStyle);

}

这样就实现我们要的效果,和PopWindow 一样,但是注意了,在一些新的版本上该效果还是有间隙,这个就要去研究对应SDK的刚才那个属性 中的参数影响了。试了两个版本都不行。。。。只有在老版本上可以,不过也给大家提供了一个思路!

Android弹出自定义Dialog,android自定义Dialog实现底部弹窗相关推荐

  1. android弹出自定义layout菜单,Android:PopWindow — 对Android的底部弹窗、顶部弹窗菜单及自定义界面的使用封装...

    转载请注明出处:http://blog..net/hmyang314/article/details/70613478 PopWindow 对Android的底部弹窗,顶部弹窗菜单及自定义界面的使用封 ...

  2. android 获取对话框对象,Android 基本Dialog和自定义Dialog

    Android 基本Dialog和自定义Dialog Dialog类是对话框的基类,但你应该避免直接实例化Dialog ,可以使用子类 1.AlertDialog 此对话框可以显示标题,最多三个按钮, ...

  3. android 自定义带输入框的dialog,Android 基本Dialog和自定义Dialog

    Android 基本Dialog和自定义Dialog Dialog类是对话框的基类,但你应该避免直接实例化Dialog ,可以使用子类 1.AlertDialog 此对话框可以显示标题,最多三个按钮, ...

  4. 【WPF】右下角弹出自定义通知样式(Notification)——简单教程

    [WPF]右下角弹出自定义通知样式(Notification)--简单教程 原文:[WPF]右下角弹出自定义通知样式(Notification)--简单教程 1.先看效果 2.实现 1.主界面是Mai ...

  5. Winform像菜单一样弹出自定义内容实现示例

    在实际工作中,如果能像菜单一样弹出自定义内容,会方便很多,比如查询时,比如下拉列表显示多列信息时,比如在填写某个信息需要查看一些信息树时.这个时候自定义弹出界面就显的非常重要了 我这里其实用到的是网上 ...

  6. wpf 点击按钮弹出新对话框_WPF弹出自定义窗口的方法

    本文实例讲述了WPF弹出自定义窗口的方法.分享给大家供大家参考,具体如下: 测试环境: [1]VS2010SP1 [2]WPF(.NET Framework 4)项目 内容简介 WPF工程如何弹出自定 ...

  7. 对div实现右键弹出自定义菜单

    实现只对蓝色的Div弹出自定义菜单,其他位置弹出默认的浏览器菜单 js代码如下: <script type="text/javascript">$(function() ...

  8. QT TextEdit设置背景、明文加密、弹出网站、弹出自定义对话框、gif动态图片、程序启动动画、打包程序、关闭事件

    TextEdit设置背景 前提必须已添加了资源图片 铭文加密 ui->passLineEdit->setEchoMode(QLineEdit::Password); 弹出网站 #inclu ...

  9. Android 对话框(Dialog) 及 自定义Dialog

    Activities提供了一种方便管理的创建.保存.回复的对话框机制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog( ...

最新文章

  1. 一位老工程师前辈的忠告
  2. limbo可以运行linux,这次真的了,安卓手机可以安装 Windows 10 了
  3. 【机器学习】降维技术-PCA
  4. 使用Xamarin开发手机聊天程序 -- 基础篇(大量图文讲解 step by step,附源码下载)
  5. 同步方法及同步代码块
  6. 中国科技大学计算机学院叶辉,中国科技大学计算机科学与技术学院导师教师师资介绍简介-黄文超...
  7. 第十天 Oracle安装前准备工作
  8. 【免费下载】2021年11月热门报告盘点(附热门报告列表及下载链接)
  9. 客户端配置_PPPoE服务器端客户端的配置案例脚本
  10. vmware中的linux虚拟机如何增加磁盘容量
  11. 动态风云--互联网感言(三)
  12. Android仿人人客户端(v5.7.1)——Auth授权认证(整理流程,重构代码)
  13. nand ECC 算法记录
  14. el-table render-header 实现多级 表头
  15. vue3.0引入element插件报错解决
  16. 如何让“后浪”热爱工作,来自“前浪”的十大拷问
  17. 人性深处的探究与还原-《少年派的奇幻漂流》的四个故事
  18. console接口是干嘛的(console接口是干嘛的电信室外光猫)
  19. pyinstaller里居然有木马?
  20. java中线,使用Voronoi图查找多边形的中线

热门文章

  1. Gamma/伽马函数,伽马分布
  2. 如何评价一个程序员的好坏
  3. 计算机二级要学的函数有哪些,计算机二级常用函数,你了解多少?
  4. 基于EV/EBITDA倍数估值法的Alpha对冲策略
  5. 简洁描述leading bass原理
  6. Saltstack_使用指南05_数据系统-Pillar
  7. OA系统选型:须有火眼金睛
  8. OpenGL-利用矩阵变换(缩放、旋转、位移),使用glm库
  9. 基于java葡萄酒销售管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  10. 腾讯百度一次面试题和经历