Android系统对话框使用详解(最详细)

在实际应用开发中,用到系统对话框中的情况几乎是没有的。按开发流程来说,UI工程师都会给出每一个弹窗的样式,故而在实际开发中都是自定义弹窗的。

即使用到的地方不多,但是我们也是需要了解并且能熟练的运用它,下面为大家奉上各种系统对话框的实现。

目录

一、系统对话框的几种类型与实现

在项目的实际开发中,用到的系统对话框几乎是没有的。原因大概包含以下几点:

样式过于单一,不能满足大部分实际项目中的需求。

对话框的样式会根据手机系统版本的不同而变化。不能达到统一的样式。

能实现的功能过于简单。

在这里先附上下面代码中出现文本的string.xml文件。

<string name="dialog_normal_content">我是普通dialog</string>
<string name="dialog_normal_more_button_content">我是普通多按钮dialog</string>
<string name="dialog_btn_confirm_text">确定</string>
<string name="dialog_btn_cancel_text">取消</string>
<string name="dialog_btn_neutral_text">忽略</string>
<string name="dialog_btn_confirm_hint_text">您点击了确定按钮</string>
<string name="dialog_btn_cancel_hint_text">您点击了取消按钮</string>
<string name="dialog_btn_neutral_hint_text">您点击了忽略按钮</string>

1、普通对话框

在实际项目开发中,此类型对话框中用到的地方要比其他类型的对话框多一些。但是考虑UI统一问题,也会很少用。

运行截图:

代码:

 private void showNormalDialog(){
  //创建dialog构造器
  AlertDialog.Builder normalDialog = new AlertDialog.Builder(this);
  //设置title
  normalDialog.setTitle(getString(R.string.dialog_normal_text));
  //设置icon
  normalDialog.setIcon(R.mipmap.ic_launcher_round);
  //设置内容
  normalDialog.setMessage(getString(R.string.dialog_normal_content));
  //设置按钮
  normalDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
      , new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
      Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_confirm_hint_text)
          ,Toast.LENGTH_SHORT).show();
      dialog.dismiss();
    }
  });
  //创建并显示
  normalDialog.create().show();
 }

系统对话框都是支持链式调用的,举例:

 new AlertDialog.Builder(this)
      .setTitle(getString(R.string.dialog_normal_text))
      .setIcon(R.mipmap.ic_launcher_round)
      .setMessage(getString(R.string.dialog_normal_content))
      .setPositiveButton(getString(R.string.dialog_btn_confirm_text)
          , new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_confirm_hint_text)
              ,Toast.LENGTH_SHORT).show();
          dialog.dismiss();
        }
      })
      .create()
      .show();

下面的代码都是可以用链式调用的,这里就不展示了。

2、普通对话框(多按钮)

在系统对话框中最多出现三个按钮,即PositiveButton(确定)、NegativeButton(取消)、NeutralButton(忽略)。

运行截图:

代码:

 private void showNormalMoreButtonDialog(){
  AlertDialog.Builder normalMoreButtonDialog = new AlertDialog.Builder(this);
  normalMoreButtonDialog.setTitle(getString(R.string.dialog_normal_more_button_text));
  normalMoreButtonDialog.setIcon(R.mipmap.ic_launcher_round);
  normalMoreButtonDialog.setMessage(getString(R.string.dialog_normal_more_button_content));
  //设置按钮
  normalMoreButtonDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
      , new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          Toast.makeText(DialogActivity.this
              ,getString(R.string.dialog_btn_confirm_hint_text),Toast.LENGTH_SHORT).show();
          dialog.dismiss();
        }
      });
  normalMoreButtonDialog.setNegativeButton(getString(R.string.dialog_btn_cancel_text)
      , new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          Toast.makeText(DialogActivity.this,
              getString(R.string.dialog_btn_cancel_hint_text),Toast.LENGTH_SHORT).show();
          dialog.dismiss();
        }
      });
  normalMoreButtonDialog.setNeutralButton(getString(R.string.dialog_btn_neutral_text)
      , new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          Toast.makeText(DialogActivity.this,
              getString(R.string.dialog_btn_neutral_hint_text),Toast.LENGTH_SHORT).show();
          dialog.dismiss();
        }
      });
  normalMoreButtonDialog.create().show();
 }

也可以用下面的实现方式,和上面的代码效果是一样的。

 private void showNormalMoreButtonDialog(){
  DialogInterface.OnClickListener setListener = null;
  AlertDialog.Builder normalMoreButtonDialog = new AlertDialog.Builder(this);
  normalMoreButtonDialog.setTitle(getString(R.string.dialog_normal_more_button_text));
  normalMoreButtonDialog.setIcon(R.mipmap.ic_launcher_round);
  normalMoreButtonDialog.setMessage(getString(R.string.dialog_normal_more_button_content));
  setListener = new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
      switch (which){
        case DialogInterface.BUTTON_POSITIVE:
          Toast.makeText(DialogActivity.this,
              getString(R.string.dialog_btn_confirm_hint_text),Toast.LENGTH_SHORT).show();
          dialog.dismiss();
          break;
        case DialogInterface.BUTTON_NEUTRAL:
          Toast.makeText(DialogActivity.this
              ,getString(R.string.dialog_btn_neutral_hint_text),Toast.LENGTH_SHORT).show();
          dialog.dismiss();
          break;
        case DialogInterface.BUTTON_NEGATIVE:
          Toast.makeText(DialogActivity.this
              ,getString(R.string.dialog_btn_cancel_hint_text),Toast.LENGTH_SHORT).show();
          dialog.dismiss();
          break;
      }
    }
  };
  normalMoreButtonDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text),setListener);
  normalMoreButtonDialog.setNegativeButton(getString(R.string.dialog_btn_cancel_text),setListener);
  normalMoreButtonDialog.setNeutralButton(getString(R.string.dialog_btn_neutral_text),setListener);
  normalMoreButtonDialog.create().show();
 }

3、普通列表对话框

此种类型的对话框能实现简单的列表。

运行截图:

代码:

 /**
  * 普通列表dialog
  */
 private void showListDialog(){
  final String listItems[] = new String[]{"listItems1","listItems2","listItems3",
      "listItems4","listItems5","listItems6"};
  AlertDialog.Builder listDialog = new AlertDialog.Builder(this);
  listDialog.setTitle(getString(R.string.dialog_list_text));
  listDialog.setIcon(R.mipmap.ic_launcher_round);
  /*
    设置item 不能用setMessage()
    用setItems
    items : listItems[] -> 列表项数组
    listener -> 回调接口
  */
  listDialog.setItems(listItems,new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
      Toast.makeText(DialogActivity.this,listItems[which],Toast.LENGTH_SHORT).show();
    }
  });
  //设置按钮
  listDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
      , new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          dialog.dismiss();
        }
      });
  listDialog.create().show();
 }

4、单选对话框

运行截图:

代码:

 private void showRadioDialog(){
  final String radioItems[] = new String[]{"radioItem1","radioItem1","radioItem1","radioItem1"};
  AlertDialog.Builder radioDialog = new AlertDialog.Builder(this);
  radioDialog.setTitle(getString(R.string.dialog_radio_text));
  radioDialog.setIcon(R.mipmap.ic_launcher_round);
  /*
    设置item 不能用setMessage()
    用setSingleChoiceItems
    items : radioItems[] -> 单选选项数组
    checkItem : 0 -> 默认选中的item
    listener -> 回调接口
  */
  radioDialog.setSingleChoiceItems(radioItems, 0, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
      Toast.makeText(DialogActivity.this,radioItems[which],Toast.LENGTH_SHORT).show();
    }
  });
  //设置按钮
  radioDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
      , new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          dialog.dismiss();
        }
      });
  radioDialog.create().show();
 }

5、多选对话框

运行截图:

代码:

private void showCheckBoxDialog(){
  final String checkBoxItems[] = new String[]{"checkBoxItems1","checkBoxItems2",
      "checkBoxItems3","checkBoxItems4"};
  final boolean isCheck[] = new boolean[]{false,true,true,false};
  AlertDialog.Builder checkBoxDialog = new AlertDialog.Builder(this);
  checkBoxDialog.setTitle(getString(R.string.dialog_check_box_text));
  checkBoxDialog.setIcon(R.mipmap.ic_launcher_round);
  /*
    设置item 不能用setMessage()
    用setMultiChoiceItems
    items : radioItems[] -> 多选选项数组
    checkItems : isCheck[] -> 是否选中数组
    listener -> 回调接口
  */
  checkBoxDialog.setMultiChoiceItems(checkBoxItems, isCheck
      , new DialogInterface.OnMultiChoiceClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
      if (isChecked){
        Toast.makeText(DialogActivity.this,
            checkBoxItems[which] + "  选中",Toast.LENGTH_SHORT).show();
      }else {
        Toast.makeText(DialogActivity.this,
            checkBoxItems[which] + "  未选中",Toast.LENGTH_SHORT).show();
      }
    }
  });
  //设置按钮
  checkBoxDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
      , new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          dialog.dismiss();
        }
      });
  checkBoxDialog.create().show();
 }

6、带输入框的弹窗

运行截图:

代码:

private void showEditDialog(){
  final EditText edit = new EditText(this);
  AlertDialog.Builder editDialog = new AlertDialog.Builder(this);
  editDialog.setTitle(getString(R.string.dialog_edit_text));
  editDialog.setIcon(R.mipmap.ic_launcher_round);
  //设置dialog布局
  editDialog.setView(edit);
  //设置按钮
  editDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
      , new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          Toast.makeText(DialogActivity.this,
              edit.getText().toString().trim(),Toast.LENGTH_SHORT).show();
          dialog.dismiss();
        }
      });
  editDialog.create().show();
 }

7、自定义布局的对话框

此类型的对话框在实际项目开发中用到的地方比提示对话框用到的地方要多一些,不过在项目几乎上都是自定义的对话框...

运行截图:

布局文件:custom_dialog_layout.xml

  <TextView
      android:id="@+id/dialog_text"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:textSize="15sp"
      android:textColor="@color/colorPrimary"
      android:gravity="center"
      android:padding="12dp"/>
   <RelativeLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content">
      <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher"/>
     <Button
       android:id="@+id/dialog_btn_confirm"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textColor="@color/colorAccent"
       android:textSize="15sp"
       android:text="@string/dialog_btn_confirm_text"
       android:layout_centerHorizontal="true"/>
     <Button
       android:id="@+id/dialog_btn_cancel"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textColor="@color/colorAccent"
       android:textSize="15sp"
       android:text="@string/dialog_btn_cancel_text"
       android:layout_centerHorizontal="true"
       android:layout_alignParentRight="true"/>
   </RelativeLayout>
 </LinearLayout>

代码:

 private void showLayoutDialog() {
  //加载布局并初始化组件
  View dialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog_layout,null);
  TextView dialogText = (TextView) dialogView.findViewById(R.id.dialog_text);
  Button dialogBtnConfirm = (Button) dialogView.findViewById(R.id.dialog_btn_confirm);
  Button dialogBtnCancel = (Button) dialogView.findViewById(R.id.dialog_btn_cancel);
  final AlertDialog.Builder layoutDialog = new AlertDialog.Builder(this);
  layoutDialog.setTitle(getString(R.string.dialog_custom_layout_text));
  layoutDialog.setIcon(R.mipmap.ic_launcher_round);
  layoutDialog.setView(dialogView);
  //设置组件
  dialogText.setText("我是自定义layout的弹窗!!");
  dialogBtnConfirm .setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      Toast.makeText(DialogActivity.this,"我是自定义layout的弹窗!!",Toast.LENGTH_SHORT).show();
    }
  });
  dialogBtnConfirm .setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      layoutDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialog) {
          dialog.dismiss();
        }
      });
    }
  });
  layoutDialog.create().show();
 }

以上就是Android系统弹窗的几种实现方式,几乎涵盖了能解决各种简单需求。其中自定义布局的方式奠定了自定义弹窗的基本实现。

二、总结

可以看出上面的几种实现方式都是通过AlertDialog类实现的。有兴趣的可以看Android源码中的AlertDialog类实现。

以上所述是小编给大家介绍的Android系统对话框使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android系统默认对话框添加图片功能

    开发工具Android Studio 今天公司UI要求软件对话框改成加图片的,以前没有做过,所以就学习了一下,废话不多说, 看效果: 创建XML文件dialog_lsit_item.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="matc

  • Android系统对话框使用详解(最详细)

    在实际应用开发中,用到系统对话框中的情况几乎是没有的.按开发流程来说,UI工程师都会给出每一个弹窗的样式,故而在实际开发中都是自定义弹窗的. 即使用到的地方不多,但是我们也是需要了解并且能熟练的运用它,下面为大家奉上各种系统对话框的实现. 目录 一.系统对话框的几种类型与实现 在项目的实际开发中,用到的系统对话框几乎是没有的.原因大概包含以下几点: 样式过于单一,不能满足大部分实际项目中的需求. 对话框的样式会根据手机系统版本的不同而变化.不能达到统一的样式. 能实现的功能过于简单. 在这里先附

  • Kotlin实现Android系统悬浮窗详解

    目录 Android 弹窗浅谈 系统悬浮窗具体实现 权限申请 代码设计 具体实现 FloatWindowService 类 FloatWindowManager 类 FloatWindowManager 类代码 FloatLayout 类及其 Layout HomeKeyObserverReceiver 类 FloatWindowUtils 类 总结 Android 弹窗浅谈 我们知道 Android 弹窗中,有一类弹窗会在应用之外也显示,这是因为他被申明成了系统弹窗,除此之外还有2类弹窗分别是

  • Android AlertDialog(对话框)实例详解

    目录 1.创建AlertDialog 1.1 布局文件代码如下: 1.2 MainActivity的主要代码如下所示: 2.普通提示对话框 3.普通列表对话框 4.单选对话框 4.复选对话框 6.自定义登录对话框 6.1自定义登录对话框的布局文件 6.2 自定义对话框的代码逻辑 7.自定义对话框需要注意问题 8.代码下载地址 总结 AlertDialog可以在当前的界面上显示一个对话框,这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力,因此AlertDialog一般是用于提示一

  • Android系统工具类详解

    本文实例为大家分享了Android系统工具类的具体代码,供大家参考,具体内容如下 系统工具类 public class systemUtil { //隐藏ipad底部虚拟按键栏 @RequiresApi(api = Build.VERSION_CODES.KITKAT) public static void closeBottomBar(Activity activity){ Window _window = activity.getWindow(); WindowManager.LayoutP

  • Android时间对话框TimePickerDialog详解

    目前网上流行着很多对"时间对话框TimePickerDialog"的讲解文章,但感觉都不是很详细.所以浣熊在这里详细对该方面的知识进行介绍,旨在帮助初学者能够快速掌握该项技术. 首先要做的是声明一个日历类的对象: private Calendar c; 然后对其进行实例化: c = Calendar.getInstance(); 实例化后便可以对该日历对象进行操作了,如c.get方法可以获得该日历对象中的相关变量(如年.月.日.时.分.秒等),这些变量的值在实例化"c = C

  • Android WebView基础应用详解

    目录 一.WebView的基础配置 二.WebView支持播放音乐 三.WebView支持视频播放 四.WebChromeClient 五.WebViewClient 1.重定向问题 2.实现预加载 3.增加错误页面展示限制 4.解决页面白屏问题 附GitHub源码:WebViewExplore 一.WebView的基础配置 WebSettings ws = getSettings(); ws.setBuiltInZoomControls(true);// 隐藏缩放按钮 ws.setLayout

  • Android LitePal的使用详解

    前言 数据库操作一直都是比较繁琐而且单一的东西,平时开发中数据库也很常见.有学过mysql的读者可能会觉得sql语句确实让人很难受.同样android中,虽然有内置数据库SQLite,但是操作起来还是非常的不方便.跟网络请求类似,当我们用原生的HttpURLConnection请求数据再用json解析,过程很繁琐,所以我们一般是封装成一个工具类,但是retrofit出现了,他帮我们解决了网络请求和解析数据的封装,同时还支持RxJava的异步,十分强大.不了解retrofit的读者也建议你们去学习

  • Android zygote启动流程详解

    对zygote的理解 在Android系统中,zygote是一个native进程,是所有应用进程的父进程.而zygote则是Linux系统用户空间的第一个进程--init进程,通过fork的方式创建并启动的. 作用 zygote进程在启动时,会创建一个Dalvik虚拟机实例,每次孵化新的应用进程时,都会将这个Dalvik虚拟机实例复制到新的应用程序进程里面,从而使得每个应用程序进程都有一个独立的Dalvik虚拟机实例. zygote进程的主要作用有两个: 启动SystemServer. 孵化应用

  • Android view绘制流程详解

    绘制流程 measure 流程测量出 View 的宽高尺寸. layout 流程确定 View 的位置及最终尺寸. draw 流程将 View 绘制在屏幕上. Measure 测量流程 系统是通过 MeasureSpec 测量 View 的,在了解测量过程之前一定要了解这个 MeasureSpec . MeasureSpec MeasureSpec 是一个 32 位的 int 值打包而来的,打包为 MeasureSpec 主要是为了避免过多的对象内存分配. 为了方便操作,MeasureSpec

  • Android ViewBinding的使用详解

    目录 一.什么是view binding 设置说明 二.基本用法 Activity中使用 Fragment 中使用 Adapter 中使用 三.了解源码实现 BaseActivity BaseFragment BaseAdapter 四.其他 最近Android Studio 升级后 butterknife 有一个警告: Resource IDs will be non-final in Android Gradle Plugin version 5.0, avoid using them as

随机推荐