欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android AlertDialog实现分享对话框/退出对话框/下载对话框

程序员文章站 2024-02-28 15:17:58
一.摘要 弹窗通常用于提示用户进行某种操作,比如:点击分享按钮,弹窗分享对话框;双击返回按钮,弹窗退出对话框;下载文件,提示下载对话框等等,分享对话框/退出对话框/下载对...

一.摘要
弹窗通常用于提示用户进行某种操作,比如:点击分享按钮,弹窗分享对话框;双击返回按钮,弹窗退出对话框;下载文件,提示下载对话框等等,分享对话框/退出对话框/下载对话框,都可以直接使用alertdialog实现,类似的效果如下图:

Android 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 
 
  } 

这两种方式的对话框展示默认属性——对话框水平垂直居中显示,对话框与左右窗体之间有一小段距离,效果图如下:

Android 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实现的弹窗效果一模一样,如下图:

Android 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软件编程有所帮助。