Android中自定义对话框(Dialog)的实例代码
程序员文章站
2023-11-21 23:58:40
1.修改系统默认的dialog样式(风格、主题)2.自定义dialog布局文件3.可以自己封装一个类,继承自dialog或者直接使用dialog类来实现,为了方便以后重复使...
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。
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。
推荐阅读
-
Android中自定义对话框(Dialog)的实例代码
-
Android 中自定义Dialog样式的Activity点击空白处隐藏软键盘功能(dialog不消失)
-
Android 自定义验证码输入框的实例代码(支持粘贴连续性)
-
Android中自定义的dialog中的EditText无法弹出输入法解决方案
-
Android中的Button自定义点击效果实例代码
-
android自定义进度条渐变色View的实例代码
-
android从系统图库中取图片的实例代码
-
Android中Dialog对话框的使用小结
-
ASP.net中Core自定义View查找位置的实例代码
-
Android实现自定义dialog的代码