Android AlertDialog实现分享对话框/退出对话框/下载对话框
一.摘要
弹窗通常用于提示用户进行某种操作,比如:点击分享按钮,弹窗分享对话框;双击返回按钮,弹窗退出对话框;下载文件,提示下载对话框等等,分享对话框/退出对话框/下载对话框,都可以直接使用alertdialog实现,类似的效果如下图:
二.alertdialog基础知识
alertdialog无法直接通过new关键字获取对象,调用方法:new alertdialog.builder.create()获取alertdialog对象,这个时候容易让人疑惑的是:如何设置对话框的属性?比如:对话框标题,对话框消息,对话框按钮等等
设置对话框属性的两种方式
第一种:设置alertdialog对象属性,具体代码如下:
private void showdialog() { alertdialog mdialog = null; mdialog = new alertdialog.builder(this).create();; mdialog.seticon(r.drawable.ic_launcher); mdialog.settitle("系统提示"); mdialog.setmessage("你确定要退出吗?"); mdialog.setbutton(dialoginterface.button_positive,"确定", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { finishmyself(); } }); mdialog.setbutton(dialoginterface.button_negative,"取消", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { toast.maketext(mainactivity.this, "再按一次退出程序", (int) touchtime) .show(); } }); mdialog.show(); }
第二种:设置builder对象属性,具体代码如下:
private void showdialog() { alertdialog mdialog = null; builder mbuilder = new alertdialog.builder(this); mbuilder.seticon(r.drawable.ic_launcher); mbuilder.settitle("系统提示"); mbuilder.setmessage("你确定要退出吗?"); mbuilder.setpositivebutton("确定", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { finish(); } }); mbuilder.setnegativebutton("取消", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { toast.maketext(mainactivity.this, "再按一次退出程序", (int) touchtime) .show(); } }); mdialog = mbuilder.create();//创建alertdialog对象 mdialog.show();//显示创建的alertdialog }
这两种方式的对话框展示默认属性——对话框水平垂直居中显示,对话框与左右窗体之间有一小段距离,效果图如下:
如何修改默认对话框属性?
如何修改alertdialog对话框默认属性,然后实现对话框内容宽度布满屏幕,高度根据内容自适应,类似文章开头点击分享按钮,从底部弹出弹窗的效果。首先创建alertdialog对话框,然后自定义对话框的布局view,最后设置window对象属性。
设置window对象屏幕宽度/高度的三种方式
第一种方式:setlayout()
获得window对象后,设置window对象的布局参数,即调用setlayout(int width,int height)方法,width取值:android.view.windowmanager.layoutparams.match_parent/android.view.windowmanager.layoutparams.wrap_content,同理height取值:android.view.windowmanager.layoutparams.match_parent/android.view.windowmanager.layoutparams.wrap_content,具体代码如下:
view view = getlayoutinflater().inflate(r.layout.popup_dialog, null); alertdialog mdialog = new alertdialog.builder(this).create(); mdialog.show();// 显示创建的alertdialog,并显示,必须放在window设置属性之前 /** *设置mdialog窗口属性:match_parent/wrap_content * */ window window =mdialog.getwindow(); window.setgravity(gravity.bottom); // 此处可以设置dialog显示的位置 window.setlayout(android.view.windowmanager.layoutparams.match_parent, android.view.windowmanager.layoutparams.wrap_content);
第二种方式:setattributes()
获得window对象后,设置window对象的属性值,即调用setattributes(layoutparams)方法,layoutparams的width变量取值:android.view.windowmanager.layoutparams.match_parent/android.view.windowmanager.layoutparams.wrap_content,同理height变量取值:android.view.windowmanager.layoutparams.match_parent/android.view.windowmanager.layoutparams.wrap_content,具体代码如下:
view view = getlayoutinflater().inflate(r.layout.popup_dialog, null); alertdialog mdialog = new alertdialog.builder(this).create(); mdialog.show();// 显示创建的alertdialog,并显示,必须放在window设置属性之前 window window =mdialog.getwindow(); window.setgravity(gravity.bottom); // 此处可以设置dialog显示的位置 windowmanager.layoutparams mparams = window.getattributes(); mparams.width = android.view.windowmanager.layoutparams.match_parent; mparams.height = android.view.windowmanager.layoutparams.wrap_content; window.setgravity(gravity.bottom); // 此处可以设置dialog显示的位置 window.setattributes(mparams);
第三种方式:setlayout()
具体代码如下:
view view = getlayoutinflater().inflate(r.layout.popup_dialog, null); alertdialog mdialog = new alertdialog.builder(this).create(); mdialog.show();// 显示创建的alertdialog,并显示,必须放在window设置属性之前 window window =mdialog.getwindow(); window.setgravity(gravity.bottom); // 此处可以设置dialog显示的位置 windowmanager manager = getwindowmanager(); display display = manager.getdefaultdisplay(); int width = display.getwidth();//获取当前屏幕宽度 int height = 300;//自定义高度值,比如:300dp window.setgravity(gravity.bottom); // 此处可以设置dialog显示的位置 window.setlayout(width, height);
三.弹窗动画基础知识
android的基本动画包括:渐变动画/平移动画/缩放动画/旋转动画/组合动画,点击“分享”按钮,弹窗从底部弹窗,再次点击弹窗消失,设置的动画——平移动画,代码如下:
<?xml version="1.0" encoding="utf-8"?> <!--enter_dialog_anim.xml,弹窗进入动画--> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromydelta="100%"> </translate> <?xml version="1.0" encoding="utf-8"?> <!--exit_dialog_anim.xml,弹窗退出动画--> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:toydelta="100%" > </translate>
在style.xml文件中添加window进入和退出分别引用的动画类型,代码如下:
<!-- 分享功能弹窗动画 --> <style name="popup_style" parent="android:animation"> <item name="@android:windowenteranimation">@anim/enter_dialog_anim</item> <item name="@android:windowexitanimation">@anim/exit_dialog_anim</item> </style>
在window属性设置中调用setcontentview()指定view对象,同时调用setwindowanimations()指定添加的动画,代码如下:
window.setcontentview(view);//这一步必须指定,否则不出现弹窗
window.setwindowanimations(r.style.popup_style); // 添加动画
四.自定义弹窗:mydialogactivity
自定义mydialogactivity实现alertdialog同样的功能,点击“分享按钮”,从窗口底部弹出弹窗,点击“取消”弹窗消息,最终效果和alertdialog实现的弹窗效果一模一样,如下图:
开发步骤:
1.定义布局popup_main.xml。popup_main.xml定义弹窗最终展示的样子,可以放置多个平台的分享按钮,比如:微信/微博/空间/人人等,代码如下:
<?xml version="1.0" encoding="utf-8"?> <!-- 底部弹窗布局 --> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/transparent" android:orientation="vertical" > <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <textview android:id="@+id/share_weibo_tv" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/share_padding" android:layout_weight="1" android:gravity="center_horizontal" android:text="@string/weibo" /> <textview android:id="@+id/share_weixin_tv" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/share_padding" android:layout_weight="1" android:gravity="center_horizontal" android:text="@string/weixin" /> </linearlayout> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <textview android:id="@+id/share_kongjian_tv" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/share_padding" android:layout_weight="1" android:gravity="center_horizontal" android:text="@string/kongjian" /> <textview android:id="@+id/share_qq_tv" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/share_padding" android:layout_weight="1" android:gravity="center_horizontal" android:text="@string/qq" /> </linearlayout> <button android:id="@+id/cancel_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/activity_vertical_margin" android:background="@drawable/btn_bg" android:text="@string/cancel" /> </linearlayout>
2.定义theme样式。theme样式定义在style.xml文件中,在androidmanifest.xml文件中的标签的android:theme=""属性中引用,代码如下:
<!-- mydialogactivity自定义threme --> <style name="theme.customdialog" parent="@android:style/theme.dialog"> <item name="android:windownotitle">true</item> <!-- 设置title --> <item name="android:windowbackground">@android:color/transparent</item> <item name="android:windowframe">@null</item> <!-- 设置边框 --> <item name="android:windowistranslucent">true</item> <!-- 设置半透明 --> <item name="android:windowfullscreen">true</item> <!-- 设置全屏 --> </style> <activity android:name="mydialogactivity" android:theme="@style/theme.customdialog"/>
3.实现mydialogactivity具体功能。
package cn.teachcourse.main; import android.annotation.suppresslint; import android.app.activity; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.graphics.drawable.bitmapdrawable; import android.graphics.drawable.drawable; import android.os.bundle; import android.view.gravity; import android.view.view; import android.view.view.onclicklistener; import android.view.window; import android.widget.button; import android.widget.textview; /* @author postmaster@teachcourse.cn @date 创建于:2016-4-14 */ public class mydialogactivity extends activity implements onclicklistener { private view view; @override protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub super.oncreate(savedinstancestate); view = getlayoutinflater().inflate(r.layout.popup_main, null, false); setcontentview(view); initview(); } private void initview() { window window = getwindow(); window.setlayout(android.view.viewgroup.layoutparams.match_parent, android.view.viewgroup.layoutparams.wrap_content); window.setgravity(gravity.bottom); window.setwindowanimations(r.style.popup_style); // 添加动画 textview weibo_tv = (textview) view.findviewbyid(r.id.share_weibo_tv); textview weixin_tv = (textview) view.findviewbyid(r.id.share_weixin_tv); textview qq_tv = (textview) view.findviewbyid(r.id.share_qq_tv); textview kongjian_tv = (textview) view .findviewbyid(r.id.share_kongjian_tv); button cancel_btn = (button) view.findviewbyid(r.id.cancel_btn); // 添加控件事件 weibo_tv.setonclicklistener(this); weixin_tv.setonclicklistener(this); qq_tv.setonclicklistener(this); kongjian_tv.setonclicklistener(this); cancel_btn.setonclicklistener(this); // 调整图片的大小/位置 abjustdrawablepos(weibo_tv, r.drawable.share_weibo); abjustdrawablepos(weixin_tv, r.drawable.share_weixin); abjustdrawablepos(kongjian_tv, r.drawable.share_kongjian); abjustdrawablepos(qq_tv, r.drawable.share_qq); } /** * 添加图标和调整位置 * * @param tv * @param draw */ @suppresslint("resourceascolor") private void abjustdrawablepos(textview tv, int draw) { bitmap mbitmap = bitmapfactory.decoderesource(getresources(), draw); mbitmap = centersquarescalebitmap(mbitmap, 250); drawable drawable = new bitmapdrawable(mbitmap); drawable.setbounds(0, 48, 0, 48);// 设置图片的边界 tv.settextcolor(r.color.fontcolor); tv.setcompounddrawables(null, drawable, null, null);// setcompounddrawables()和setbounds()方法一起使用 // 添加textview图标 tv.setcompounddrawableswithintrinsicbounds(null, drawable, null, null); tv.setcompounddrawablepadding(10);// 设置图片和text之间的间距 if (mbitmap != null) { mbitmap = null; drawable = null; } } /** * * @param bitmap * 原图 * @param edgelength * 希望得到的正方形部分的边长 * @return 缩放截取正中部分后的位图。 */ public static bitmap centersquarescalebitmap(bitmap bitmap, int edgelength) { if (null == bitmap || edgelength <= 0) { return null; } bitmap result = bitmap; int widthorg = bitmap.getwidth(); int heightorg = bitmap.getheight(); if (widthorg >= edgelength && heightorg >= edgelength) { // 压缩到一个最小长度是edgelength的bitmap int longeredge = (int) (edgelength * math.max(widthorg, heightorg) / math .min(widthorg, heightorg)); int scaledwidth = widthorg > heightorg ? longeredge : edgelength; int scaledheight = widthorg > heightorg ? edgelength : longeredge; bitmap scaledbitmap; try { scaledbitmap = bitmap.createscaledbitmap(bitmap, scaledwidth, scaledheight, true); } catch (exception e) { return null; } // 从图中截取正中间的正方形部分。 int xtopleft = (scaledwidth - edgelength) / 2; int ytopleft = (scaledheight - edgelength) / 2; try { result = bitmap.createbitmap(scaledbitmap, xtopleft, ytopleft, edgelength, edgelength); scaledbitmap.recycle(); } catch (exception e) { return null; } } return result; } @override public void onclick(view v) { switch (v.getid()) { /** * 点击分享图标,弹出分享界面 */ case r.id.share_to_btn: break; case r.id.share_weibo_tv: break; case r.id.share_weixin_tv: break; case r.id.share_qq_tv: break; case r.id.share_kongjian_tv: break; case r.id.cancel_btn: finish(); break; default: break; } } }
4.弹出弹窗,调用startactivity(this,mydialogactivity.class)。
以上就是本文的全部内容,希望对大家学习android软件编程有所帮助。
上一篇: C#实现上传照片到物理路径,并且将地址保存到数据库的小例子
下一篇: 检测MySQL的表的故障的方法