用户登录
用户注册

分享至

Android中自定义对话框(Dialog)的实例代码

  • 作者: 老衲终于硬了
  • 来源: 51数据库
  • 2021-10-21
1.修改系统默认的dialog样式(风格、主题)

2.自定义dialog布局文件

3.可以自己封装一个类,继承自dialog或者直接使用dialog类来实现,为了方便以后重复使用,建议自己封装一个dialog类

 
第一步:

  我们知道android定义个控件或view的样式都是通过定义其style来实现的,查看android框架中的主题文件,在源码中的路径:/frameworks/base/core/res/res/values/themes.xml,我们可以看到,android为dialog定义了一个样式,
复制代码 代码如下:

<style name="theme.dialog">
<item name="android:windowframe">@null</item>
<item name="android:windowtitlestyle">@android:style/dialogwindowtitle</item>
<item name="android:windowbackground">@android:drawable/panel_background</item>
<item name="android:windowisfloating">true</item>
<item name="android:windowcontentoverlay">@null</item>
<item name="android:windowanimationstyle">@android:style/animation.dialog</item>
<item name="android:windowsoftinputmode">stateunspecified|adjustpan</item>
</style>

我们可以看到,在themes.xml中定义的dialog的样式,其中,定义了window的标题样式,window的背景图,是否悬浮等等。

  那么,我们要创建具有自定义样式的dialog就可以创建一个styles.xml,在其中定义我们自己的dialog样式,让其继承自theme.dialog样式,并修改其中的某些属性即可。

  定义我们自己的dialog样式:

  a.创建一个styles.xml文件,放在res/values 文件夹下(当然了,这就不用说了。。。啰嗦一下)

  b.在styles.xml中定义dialog样式,代码如下:
复制代码 代码如下:

<style name="theme_dialog" parent="@android:style/theme.dialog">
<item name="android:windowbackground">@android:color/transparent</item>
<item name="android:windownotitle">true</item>
</style>

  上面代码中,定义了一个样式theme_dialog,继承自@android:style/theme.dialog,然后定义了dialog所在window的背景图,此处使用的是透明颜色#00000000,然后定义了dialog所在的window隐藏标题(系统定义dialog样式是带有标题的,在此设置此属性为true可隐藏标题),自定义dialog样式到这就完成了。

第二步:

  定义dialog的布局:

  创建一个布局文件layout_dialog.xml,代码如下:
复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<linearlayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/pp_bg_dialog"
android:gravity="center">

<progressbar android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/progressbar_normal"/>

<textview android:layout_width="wrap_content" android:layout_height="wrap_content"
style="@style/text_white_small" android:layout_margintop="5dp"
android:text="正在删除..." android:id="@+id/message"/>
</linearlayout>

这里使用了一个垂直方向的线性布局,并且设置所有子元素居中,子元素为已个进度条progressbar和一个textview。

  此处,progressbar采用自定义样式,使用系统默认的progressbar可达到同样的效果(大同小异)。linearlayout的背景

android:background="@drawable/pp_bg_dialog"(即上面效果图中居中显示的黑色透明背景框)是一个自定义的图片资源shape:
复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="10dp"/>
<solid android:color="#55000000"/>

</shape>

代码中定义了一个矩形,并设置了圆角和颜色。到此,dialog的布局就完成了。
第三步:
  自定义customdialog类,继承自dialog,代码如下:
复制代码 代码如下:

public class customdialog extends dialog { 2
private static int default_width = 160; //默认宽度
private static int default_height = 120;//默认高度
public customdialog(context context, int layout, int style) {
this(context, default_width, default_height, layout, style);
}

public customdialog(context context, int width, int height, int layout, int style) {
super(context, style);12
//set content
setcontentview(layout);
//set window params
window window = getwindow();
windowmanager.layoutparams params = window.getattributes();
//set width,height by density and gravity
float density = getdensity(context);
params.width = (int) (width*density);
params.height = (int) (height*density);
params.gravity = gravity.center;
window.setattributes(params);
}
private float getdensity(context context) {
resources resources = context.getresources();
displaymetrics dm = resources.getdisplaymetrics();
return dm.density;
}
}

在构造方法中设置了dialog的contentview,并且设置了window的宽度、高度和居中显示。

customdialog使用方法如下:
复制代码 代码如下:

public class customdialogdemoactivity extends activity {
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.test);
customdialog dialog1 = new customdialog(this, r.layout.common_dialog, r.style.theme_dialog);//dialog使用默认大小(160)
customdialog dialog2 = new customdialog(this, 180, 180, r.layout.common_dialog, r.style.theme_dialog);
dialog2.show();//显示dialog
    //如果要修改dialog中的某个view,比如把"正在删除..."改为"加载中..."
textview mmessage = (textview) dialog2.findviewbyid(r.id.message);
mmessage.settext("加载中...");
}
}


大体过程就是这样,根据以上大家可以自由发挥吧,希望都设计出自己满意的dialog。
软件
前端设计
程序设计
Java相关