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

(0)

相关推荐

  • Android实现点击AlertDialog上按钮时不关闭对话框的方法

    本文实例讲述了Android实现点击AlertDialog上按钮时不关闭对话框的方法.分享给大家供大家参考.具体如下: 开发过程中,有时候会有这样的需求: 点击某个按钮之后显示一个对话框,对话框上面有一个输入框,并且有"确认"和"取消"两个按钮.当用户点击确认按钮时,需要对输入框的内容进行判断.如果内容为空则不关闭对话框,并toast提示. 使用AlertDialog.Builder创建对话框时,可以使用builder.setNegativeButton和build

  • Android Alertdialog(实现警告对话框)

    在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,AlertDialog实现方法为建造者模式.下面我们模拟卸载应用程序时弹出的最为普通的警告对话框,如下图: layout布局界面代码示例: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:

  • ANDROID中自定义对话框AlertDialog使用示例

    在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,AlertDialog实现方法为建造者模式.AlertDialog中定义的一些对话框往往无法满足我们关于对话框的需求,这时我们就需要通过自定义对话框VIEW来实现需求,这里我自定义一个登陆的提示对话框,效果图显示如下: Layout(alertdialog自定义登陆按钮)界面代码: <?xml version="1.0" en

  • Android使用AlertDialog实现对话框

    示例: 一.确定对话框 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("确认对话框"); builder.setIcon(R.drawable.icon_72); builder.setMessage("这里是对话框内容"); builder.setPositiveButton("确定", new DialogInterface.OnCl

  • Android AlertDialog对话框用法示例

    本文实例讲述了Android AlertDialog对话框用法.分享给大家供大家参考,具体如下: AlertDialog对话框的介绍 1.获得AlertDialog静态内部类Buidler对象,由该类来创建AlertDialog对象,因为AlertDialog的构造方法全部是Protected类型 2.通过Buidler对象设置对话框的标题.按钮以及按钮要响应的事件DialogInterface.OnClickListener 3.调用Buidler的create()方法创建对话框 4.调用Al

  • 简析Android多种AlertDialog对话框效果

    android提供了四类常用的对话框,本文分享具体实现方法: 1.AlertDialog,功能最丰富,实际运用最广泛 2.progressDialog,进度条对话框 3.DatePickerDialog,日期选择对话框 4.TimePickerDialog,时间选择对话框 这里主要介绍第一种,剩下的三种都是第一种的子类,所以其方法,都可以直接使用. 创建一个对话框一般需要下面几个步骤 1.创建AlertDialog.Builder对象 2.对AlertDialog.Builder通过SetTit

  • Android修改源码解决Alertdialog触摸对话框边缘消失的问题

    研究其父类时候发现,可以设置这么一条属性,在AlertDialog.Builder.create()之后才能调用这两个方法 方法一: setCanceledOnTouchOutside(false);调用这个方法时,按对话框以外的地方不起作用.按返回键还起作用 方法二: setCanceleable(false);调用这个方法时,按对话框以外的地方不起作用.按返回键也不起作用 这两个方法都属于Dialog方法,可查阅源码 修改后的源码如下: 复制代码 代码如下: case 1:         

  • Android中AlertDialog各种对话框的用法实例详解

    目标效果: 程序运行,显示图一的几个按钮,点击按钮分别显示图二到图六的对话框,点击对话框的某一项或者按钮,也会显示相应的吐司输出. 1.activity_main.xml页面存放五个按钮. activity_main.xml页面: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&

  • Android编程实现AlertDialog自定义弹出对话框的方法示例

    本文实例讲述了Android编程实现AlertDialog自定义弹出对话框的方法.分享给大家供大家参考,具体如下: 弹出对话框,显示自定义的布局文件 弹出对话框提示设置密码或登录密码 private void showSetPasswordDialod(){ View dialogView=mInflater.inflate(R.layout.protect_first_dialog, null); AlertDialog.Builder builder=new AlertDialog.Buil

  • Android常用的AlertDialog对话框及自定义对话框

    常用的Dialog有确认对话框,单选按钮对话框,多选按钮对话框,复选按钮对话框另外还有自定义的对话框 AlertDialog的常用方法 setTitle:为对话框设置标题 setMessage:为对话框设置内容 setIcon:为对话框设置图标 setItems设置对话框要显示的list setMultiChoiceItems:一般用于复选框显示 setSingleChoiceItem:,设置单选按钮 setNeutralButton:普通按钮 setPositiveButton:添加确定按钮

  • Android AlertDialog对话框详解及实例

    Android  AlertDialog 关系图如下: Android主要提供四种对话框: 1:AlertDialog:功能最丰富,实际应用最广的对话框. 2:ProgressDialog:进度条对话框 3:DatePickerDialog:日期选择器对话框 4:TimePickerDialog:时间选择器对话框 创建一个对话框的步骤: AlertDialog.Builder builder = new AlertDialog.Builder(this) // 1:设置对话框标题 .setTit

  • Android中AlertDialog 点击按钮后不关闭对话框的功能

    这里的问题:当我点击确定按钮,也就是 AlertDialog 里的 PositiveButton 的时候,我们需要判断用户是输入是否符合我们的预期,如果不符合通常提示用户重写输入,且不关闭当前的对话框,但上图中点击按钮后会自动的关闭窗口. 先看原来的这个是怎么写的: private void openDialog() { LinearLayout linearLayout = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.l

随机推荐