android开发分享Android AlertDialog(对话框)实例详解

目录1.创建alertdialog1.1 布局文件代码如下:1.2 mainactivity的主要代码如下所示:2.普通提示对话框3.普通列表对话框4.单选对话框4、复选对话框6、自定义登录对话框6.

目录
  • 1.创建alertdialog
    • 1.1 布局文件代码如下:
    • 1.2 mainactivity的主要代码如下所示:
  • 2.普通提示对话框
    • 3.普通列表对话框
      • 4.单选对话框
        • 4、复选对话框
          • 6、自定义登录对话框
            • 6.1自定义登录对话框的布局文件
            • 6.2 自定义对话框的代码逻辑
          • 7.自定义对话框需要注意问题
            • 8.代码下载地址
              • 总结

                alertdialog可以在当前的界面上显示一个对话框,这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力,因此alertdialog一般是用于提示一些非常重要的内容或者警告信息。

                上述就是android开发分享Android AlertDialog(对话框)实例详解的全部内容,如果对大家有所用处且需要了解更多关于Android学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

                1.创建alertdialog

                首先,我们来了解一下alertdialog的大体创建顺序。与textview、button这些控件稍有不同,alertdialog并不是初始化(findviewbyid)之后就直接调用各种方法了。仔细想想alertdialog的使用场景, 它并不像textview和button那些控件似的一般都是固定在界面上,而是在某个时机才会触发出来(比如用户点击了某个按钮或者断网了)。所以alertdialog并不需要到布局文件中创建,而是在代码中通过构造器(alertdialog.builder)来构造标题、图标和按钮等内容的。

                    1.创建构造器alertdialog.builder的对象;

                    2.通过构造器对象调用settitle、setmessage、seticon等方法构造对话框的标题、信息和图标等内容;

                    3.根据需要调用setpositive/negative/neutralbutton()方法设置正面按钮、负面按钮和中立按钮;

                    4.调用构造器对象的create方法创建alertdialog对象;

                    5.alertdialog对象调用show方法,让对话框在界面上显示。

                注:alertdialog.builder自己也有一个show方法,可以显示对话框,所以上面的第4、第5步可以简化为一步。

                下面,我们就来创建几种常用的alertdialog吧。新建一个工程,在activity_main.xml布局文件上放置五个按钮,点击按钮就会有相应的对话框弹出。

                1.1 布局文件代码如下:

                  <?xml version="1.0" encoding="utf-8"?>  <linearlayout xmlns:android="https://schemas.android.com/apk/res/android"      xmlns:tools="https://schemas.android.com/tools"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical"      tools:context="com.fd.alertdialog.mainactivity">         <button          android:id="@+id/btn_normal_dialog"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:text="普通对话框" />         <button          android:id="@+id/btn_item_dialog"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:text="普通列表对话框" />         <button          android:id="@+id/btn_single_choice"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:text="单选对话框" />         <button          android:id="@+id/btn_multi_choice"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:text="复选对话框" />         <button          android:id="@+id/btn_custom_dialog"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:text="自定义对话框" />     </linearlayout>

                1.2 mainactivity的主要代码如下所示:

                  package com.fd.alertdialog;     import android.content.dialoginterface;  import android.os.bundle;  import android.support.v7.app.alertdialog;  import android.support.v7.app.appcompatactivity;  import android.text.textutils;  import android.util.log;  import android.view.view;  import android.widget.button;  import android.widget.edittext;  import android.widget.toast;     import java.util.arraylist;  import java.util.list;     public class mainactivity extends appcompatactivity implements view.onclicklistener {      public static string tag = mainactivity.class.getsimplename();      private int chedkeditem = 0;      private string name;      private string pwd;         @override      protected void oncreate(bundle savedinstancestate) {          super.oncreate(savedinstancestate);          setcontentview(r.layout.activity_main);             bindview();      }         private void bindview() {          button btn_normal_dialog = (button) findviewbyid(r.id.btn_normal_dialog);          button btn_item_dialog = (button) findviewbyid(r.id.btn_item_dialog);          button btn_single_choice = (button) findviewbyid(r.id.btn_single_choice);          button btn_multi_choice = (button) findviewbyid(r.id.btn_multi_choice);          button btn_custom_dialog = (button) findviewbyid(r.id.btn_custom_dialog);          btn_normal_dialog.setonclicklistener(this);          btn_item_dialog.setonclicklistener(this);          btn_single_choice.setonclicklistener(this);          btn_multi_choice.setonclicklistener(this);          btn_custom_dialog.setonclicklistener(this);      }         @override      public void onclick(view v) {          switch (v.getid()) {              case r.id.btn_normal_dialog:                  tipdialog();                //提示对话框                  break;              case r.id.btn_item_dialog:                  itemlistdialog();           //列表对话框                  break;              case r.id.btn_single_choice:                  singlechoicedialog();       //单选对话框                  break;              case r.id.btn_multi_choice:                   multichoicedialog();        //多选对话框                  break;                case r.id.btn_custom_dialog:                  customdialog();             //自定义对话框                  break;              default:                  break;          }      }  }

                代码比较简单,这里就不做详细讲解了。接下来看一下各个对话框的具体代码。

                2.普通提示对话框

                提示对话框应该是最常见的alertdialog了,其上主要是提示标题,消息主体,底部“取消”、“确定”等按钮。

                  /**   * 提示对话框   */  public void tipdialog() {      alertdialog.builder builder = new alertdialog.builder(mainactivity.this);      builder.settitle("提示:");      builder.setmessage("这是一个普通对话框,");      builder.seticon(r.mipmap.ic_launcher);      builder.setcancelable(true);            //点击对话框以外的区域是否让对话框消失         //设置正面按钮      builder.setpositivebutton("确定", new dialoginterface.onclicklistener() {          @override          public void onclick(dialoginterface dialog, int which) {              toast.maketext(mainactivity.this, "你点击了确定", toast.length_short).show();              dialog.dismiss();          }      });      //设置反面按钮      builder.setnegativebutton("取消", new dialoginterface.onclicklistener() {          @override          public void onclick(dialoginterface dialog, int which) {              toast.maketext(mainactivity.this, "你点击了取消", toast.length_short).show();              dialog.dismiss();          }      });      //设置中立按钮      builder.setneutralbutton("保密", new dialoginterface.onclicklistener() {          @override          public void onclick(dialoginterface dialog, int which) {              toast.maketext(mainactivity.this, "你选择了中立", toast.length_short).show();              dialog.dismiss();          }      });            alertdialog dialog = builder.create();      //创建alertdialog对象      //对话框显示的监听事件      dialog.setonshowlistener(new dialoginterface.onshowlistener() {          @override          public void onshow(dialoginterface dialog) {              log.e(tag, "对话框显示了");          }      });      //对话框消失的监听事件      dialog.setoncancellistener(new dialoginterface.oncancellistener() {          @override          public void oncancel(dialoginterface dialog) {              log.e(tag, "对话框消失了");          }      });      dialog.show();                              //显示对话框  }

                具体介绍一下用到的方法吧: 

                settitle:设置对话框的标题,比如“提示”、“警告”等; 

                setmessage:设置对话框要传达的具体信息; 

                seticon: 设置对话框的图标; 

                setcancelable: 点击对话框以外的区域是否让对话框消失,默认为true; 

                setpositivebutton:设置正面按钮,表示“积极”、“确认”的意思,第一个参数为按钮上显示的文字,下同; 

                setnegativebutton:设置反面按钮,表示“消极”、“否认”、“取消”的意思; 

                setneutralbutton:设置中立按钮; 

                setonshowlistener:对话框显示时触发的事件; 

                setoncancellistener:对话框消失时触发的事件。

                当然,这些设置并不是非要不可,而是根据自己需要而定。比如标题、图标这些就可要可不要。

                效果如下图所示:

                Android AlertDialog(对话框)实例详解

                你或许会有这样的疑问:既然底部那些按钮的文字和点击事件的内容都是我们自己来写的,那不是可以把正面按钮的内容和反面按钮的内容互换吗?看看运行后的效果图就会发现,反面按钮是在正面按钮的左边的,所以考虑到用户的操作习惯和代码的语义,我们最好还是按照api来写。

                3.普通列表对话框

                列表对话框的内容就是一列显示内容,需要用到构造器的setitems方法,参数一是列表数据,参数二是点击监听接口,我们要实现这样一个小功能,用户在点击某一项时弹出一个toast提示选中项的内容。

                代码如下所示:

                  /**   * 列表对话框   */  private void itemlistdialog() {      alertdialog.builder builder = new alertdialog.builder(mainactivity.this);      builder.settitle("选择你喜欢的课程:");      builder.setcancelable(true);      final string[] lesson = new string[]{"语文", "数学", "英语", "化学", "生物", "物理", "体育"};      builder.seticon(r.mipmap.ic_launcher);      builder.seticon(r.mipmap.tab_better_pressed)              .setitems(lesson, new dialoginterface.onclicklistener() {                  @override                  public void onclick(dialoginterface dialog, int which) {                      toast.maketext(getapplicationcontext(), "你选择了" + lesson[which], toast.length_short).show();                  }              }).create();      //设置正面按钮      builder.setpositivebutton("确定", new dialoginterface.onclicklistener() {          @override          public void onclick(dialoginterface dialog, int which) {              dialog.dismiss();          }      });      //设置反面按钮      builder.setnegativebutton("取消", new dialoginterface.onclicklistener() {          @override          public void onclick(dialoginterface dialog, int which) {              dialog.dismiss();          }      });      alertdialog dialog = builder.create();     //创建alertdialog对象      dialog.show();                              //显示对话框  }

                运行后的效果如下所示:

                Android AlertDialog(对话框)实例详解

                4.单选对话框

                单选对话框的内容就是一个单项选择列表,需要用到setsinglechoiceitems方法,参数一是列表数据,参数二是默认选中的item,参数三则是点击监听接口,我们要实现这样一个小功能,用户在选好某一项之后记下其选择,下次点开对话框时就默认选中该项。

                  /**   * 单选对话框   */  public void singlechoicedialog() {      alertdialog.builder builder = new alertdialog.builder(mainactivity.this);         builder.settitle("你现在居住地是:");      final string[] cities = {"北京", "上海", "广州", "深圳", "杭州", "天津", "成都"};         builder.setsinglechoiceitems(cities, chedkeditem, new dialoginterface.onclicklistener() {          @override          public void onclick(dialoginterface dialog, int which) {              toast.maketext(getapplicationcontext(), "你选择了" + cities[which], toast.length_short).show();              chedkeditem = which;          }      });      builder.setpositivebutton("确认", new dialoginterface.onclicklistener() {          @override          public void onclick(dialoginterface dialog, int which) {              dialog.dismiss();          }      });         builder.setnegativebutton("取消", new dialoginterface.onclicklistener() {          @override          public void onclick(dialoginterface dialog, int which) {              dialog.dismiss();          }      });         alertdialog dialog = builder.create();  //创建alertdialog对象      dialog.show();                           //显示对话框  }

                运行后的效果如下所示:

                Android AlertDialog(对话框)实例详解

                你可能会把checkeditem的赋值放在确定按钮的点击事件中,这一看似乎没什么问题,但是这样是错误的!仔细阅读谷歌的api文档就知道了,setsinglechoiceitems 方法中实现的onclick方法中which表示的是当前选中的列表中的item下标,而setpositivebutton和setnegativebutton方法那里的which表示的却是按钮的种类,正面按钮中的which值是-1,反面按钮的是-2,与列表的item是没有关系的。

                例子中的保存选中item的方法有问题的,当activity被销毁之后重新创建的话数据就会丢失,要想持久化保存的话要用sharedpreferences或者数据库。

                4、复选对话框

                复选对话框是一个可以重复选中的列表,与单选对话框有点像,不过调用的是setmultichoiceitems方法,而且多了一个布尔值参数ischecked,表示当前点击的item是否被选中。

                我们创建一个集合,将点击选中的item添加到集合中,取消勾选的话就从集合中移除,点击确认按钮后就将选中内容显示出来。

                  /**   * 复选对话框   */  public void multichoicedialog() {      alertdialog.builder builder = new alertdialog.builder(mainactivity.this);      builder.settitle("请选择你喜欢的颜色:");      final string[] colors = {"红色", "橙色", "黄色", "绿色", "蓝色", "靛色", "紫色"};      final list<string> mycolors = new arraylist<>();         builder.setmultichoiceitems(colors, null, new dialoginterface.onmultichoiceclicklistener() {          @override          public void onclick(dialoginterface dialog, int which, boolean ischecked) {              if (ischecked) {                  mycolors.add(colors[which]);              } else {                  mycolors.remove(colors[which]);              }          }      });         builder.setpositivebutton("确认", new dialoginterface.onclicklistener() {          @override          public void onclick(dialoginterface dialog, int which) {              string result = "";              for (string color : mycolors) {                  result += color + "、";              }              toast.maketext(getapplicationcontext(), "你选择了: " + result, toast.length_short).show();              dialog.dismiss();          }      });         builder.setnegativebutton("取消", new dialoginterface.onclicklistener() {          @override          public void onclick(dialoginterface dialog, int which) {              mycolors.clear();              dialog.dismiss();          }      });      alertdialog dialog = builder.create();      //创建alertdialog对象      dialog.show();                               //显示对话框  }

                运行后效果图如下所示:

                Android AlertDialog(对话框)实例详解

                6、自定义登录对话框

                有时候,只显示简单的标题和信息是满足不了我们的要求,比如我们要实现一个登录对话框的话,那就需要在对话框上放置edittext输入框了。alertdialog早就为我们准备好了setview方法,只要往里面放进我们需要的对话框的view对象就可以了。

                6.1自定义登录对话框的布局文件

                  <?xml version="1.0" encoding="utf-8"?>  <linearlayout xmlns:android="https://schemas.android.com/apk/res/android"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical">         <textview          android:id="@+id/textview"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:background="#169ee5"          android:gravity="center"          android:text="请先登录"          android:textcolor="@android:color/white"          android:textsize="20sp" />         <edittext          android:id="@+id/et_name"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:hint="请输入你的账户名:"          android:textsize="18sp" />         <edittext          android:id="@+id/et_pwd"          android:inputtype="textpassword"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:hint="请输入密码:"          android:textsize="18sp" />         <linearlayout          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:layout_marginbottom="5dp"          android:orientation="horizontal"          android:paddingleft="5dp"          android:paddingright="5dp">             <button              android:id="@+id/btn_cancel"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_marginright="10dp"              android:layout_weight="1"              android:background="#169ee5"              android:text="取消"              android:textcolor="@android:color/white"              android:textsize="16sp" />             <button              android:id="@+id/btn_login"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_weight="1"              android:background="#169ee5"              android:text="登录"              android:textcolor="@android:color/white"              android:textsize="16sp" />      </linearlayout>  </linearlayout>

                6.2 自定义对话框的代码逻辑

                setview方法是通过alertdialog的对象调用的,所以这里的代码顺序会稍有不同:我们要先创建alertdialog对象和view对象,然后再去初始化对话框中的控件。

                  /**   * 自定义登录对话框   */  public void customdialog() {      alertdialog.builder builder = new alertdialog.builder(mainactivity.this);      final alertdialog dialog = builder.create();      view dialogview = view.inflate(mainactivity.this, r.layout.activity_custom, null);      dialog.setview(dialogview);      dialog.show();         final edittext et_name = dialogview.findviewbyid(r.id.et_name);      final edittext et_pwd = dialogview.findviewbyid(r.id.et_pwd);         final button btn_login = dialogview.findviewbyid(r.id.btn_login);      final button btn_cancel = dialogview.findviewbyid(r.id.btn_cancel);         btn_login.setonclicklistener(new view.onclicklistener() {          @override          public void onclick(view view) {              name = et_name.gettext().tostring();              pwd = et_pwd.gettext().tostring();              if (textutils.isempty(name) || textutils.isempty(pwd)) {                  toast.maketext(mainactivity.this, "用户名或密码不能为空!", toast.length_short).show();                  return;              }              toast.maketext(mainactivity.this, "用户名:" + name + "n" + "用户密码:" + pwd, toast.length_short).show();              dialog.dismiss();          }      });         btn_cancel.setonclicklistener(new view.onclicklistener() {          @override          public void onclick(view view) {              dialog.dismiss();          }      });  }

                运行后的效果图如下所示:

                Android AlertDialog(对话框)实例详解

                7.自定义对话框需要注意问题

                7.1 系统dialog的宽度默认是固定的,即使你自定义布局怎么修改宽度也不起作用,高度可根据布局自动调节。如果想修改弹出窗体大小,可以使用下面这段代码来实现改变对话框的宽高。这段代码必须在dialog.show()方法之后调用才有效。

                  //此处设置位置窗体大小,  dialog.getwindow().setlayout(width,height);

                创建新的布局文件activity_layout.xml

                  <?xml version="1.0" encoding="utf-8"?>  <linearlayout xmlns:android="https://schemas.android.com/apk/res/android"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical">         <textview          android:id="@+id/textview"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:background="#169ee5"          android:gravity="center"          android:text="请先登录"          android:textcolor="@android:color/white"          android:textsize="20sp" />      <textview          android:id="@+id/textview4"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:background="#169ee5"          android:gravity="center"          android:text="请先登录"          android:textcolor="@android:color/white"          android:textsize="20sp" />      <textview          android:id="@+id/textview3"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:background="#169ee5"          android:gravity="center"          android:text="请先登录"          android:textcolor="@android:color/white"          android:textsize="20sp" />      <textview          android:id="@+id/textview2"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:background="#169ee5"          android:gravity="center"          android:text="请先登录"          android:textcolor="@android:color/white"          android:textsize="20sp" />      <textview          android:id="@+id/textview1"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:background="#169ee5"          android:gravity="center"          android:text="请先登录"          android:textcolor="@android:color/white"          android:textsize="20sp" />         <edittext          android:id="@+id/et_name"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:hint="请输入你的账户名:"          android:textsize="18sp" />         <edittext          android:id="@+id/et_pwd"          android:inputtype="textpassword"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:hint="请输入密码:"          android:textsize="18sp" />         <linearlayout          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:layout_marginbottom="5dp"          android:orientation="horizontal"          android:paddingleft="5dp"          android:paddingright="5dp">             <button              android:id="@+id/btn_cancel"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_marginright="10dp"              android:layout_weight="1"              android:background="#169ee5"              android:text="取消"              android:textcolor="@android:color/white"              android:textsize="16sp" />             <button              android:id="@+id/btn_login"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_weight="1"              android:background="#169ee5"              android:text="登录"              android:textcolor="@android:color/white"              android:textsize="16sp" />      </linearlayout>  </linearlayout>

                代码逻辑和6.2的代码逻辑差不多,只是多了设置对话框宽度的调用 。

                  /**   * 修改对话框显示的宽度   */  public void customdialogdisplay() {      alertdialog.builder builder = new alertdialog.builder(mainactivity.this);      final alertdialog dialog = builder.create();      view dialogview = view.inflate(mainactivity.this, r.layout.activity_layout, null);      dialog.setview(dialogview);      dialog.show();      dialog.getwindow().setlayout(screenutils.getscreenwidth(this)/4*3, linearlayout.layoutparams.wrap_content);         final edittext et_name = dialogview.findviewbyid(r.id.et_name);      final edittext et_pwd = dialogview.findviewbyid(r.id.et_pwd);         final button btn_login = dialogview.findviewbyid(r.id.btn_login);      final button btn_cancel = dialogview.findviewbyid(r.id.btn_cancel);         btn_login.setonclicklistener(new view.onclicklistener() {          @override          public void onclick(view view) {              name = et_name.gettext().tostring();              pwd = et_pwd.gettext().tostring();              if (textutils.isempty(name) || textutils.isempty(pwd)) {                  toast.maketext(mainactivity.this, "用户名或密码不能为空!", toast.length_short).show();                  return;              }              toast.maketext(mainactivity.this, "用户名:" + name + "n" + "用户密码:" + pwd, toast.length_short).show();              dialog.dismiss();          }      });         btn_cancel.setonclicklistener(new view.onclicklistener() {          @override          public void onclick(view view) {              dialog.dismiss();          }      });     }

                screenutils工具类代码

                  public class screenutils {         /**       * 获取屏幕高度(px)       */      public static int getscreenheight(context context) {          return context.getresources().getdisplaymetrics().heightpixels;      }      /**       * 获取屏幕宽度(px)       */      public static int getscreenwidth(context context) {          return context.getresources().getdisplaymetrics().widthpixels;      }     }

                效果图:

                Android AlertDialog(对话框)实例详解

                7.2 改变android dialog弹出后的activity背景亮度:

                在代码中修改.lp.alpha大小,值的大小可根据自己要求设置。

                  // 设置屏幕背景变暗  private void setscreenbgdarken() {      windowmanager.layoutparams lp = getwindow().getattributes();      lp.alpha = 0.5f;      lp.dimamount = 0.5f;      getwindow().setattributes(lp);  }  // 设置屏幕背景变亮  private void setscreenbglight() {          windowmanager.layoutparams lp = getwindow().getattributes();      lp.alpha = 1.0f;      lp.dimamount = 1.0f;      getwindow().setattributes(lp);  }

                7.3 如何控制弹窗弹出的位置:

                一般都是在屏幕正中间弹出默认,但也可以控制从别的地方弹出,比如从底部弹出,可以这样写

                  private void popfrombottom(dialog dialog) {      window win = dialog.getwindow();      win.setgravity(gravity.bottom);   // 这里控制弹出的位置      win.getdecorview().setpadding(0, 0, 0, 0);      windowmanager.layoutparams lp = win.getattributes();      lp.width = windowmanager.layoutparams.match_parent;      lp.height = windowmanager.layoutparams.wrap_content;      dialog.getwindow().setbackgrounddrawable(null);      win.setattributes(lp);  }

                8.代码下载地址

                https://github.com/streate/alertdialogdemo

                总结

                到此这篇关于android alertdialog(对话框)的文章就介绍到这了,更多相关android alertdialog(对话框)详解内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

                本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

                ctvol管理联系方式QQ:251552304

                本文章地址:https://www.ctvol.com/addevelopment/948911.html

                (0)
                上一篇 2021年11月22日
                下一篇 2021年11月22日

                精彩推荐