Android开发过程中,常常会遇到一些需求场景——在界面上弹出一个弹框,对用户进行提醒并让用户进行某些选择性的操作,

如退出登录时的弹窗,让用户选择“退出”还是“取消”等操作。

Android系统提供了Dialog类,以及Dialog的子类,常见如AlertDialog来实现此类功能。

一般情况下,利用Android提供的Dialog及其子类能够满足多数此类需求,然而,其不足之处体现在:

1. 基于Android提供的Dialog及其子类样式单一,风格上与App本身风格可能不太协调;

2. Dialog弹窗在布局和功能上有所限制,有时不一定能满足实际的业务需求。

本文将通过在Dialog基础上构建自定义的Dialog弹窗,以最常见的确认弹框为例。

本样式相对比较简单:上面有一个弹框标题(提示语),下面左右分别是“确认”和“取消”按钮,当用户点击“确认”按钮时,弹框执行

相应的确认逻辑,当点击“取消”按钮时,执行相应的取消逻辑。

首先,自定义弹框样式:

  1. 1 <?xml version="1.0" encoding="utf-8"?>
  2. 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. 3 android:layout_width="match_parent"
  4. 4 android:layout_height="wrap_content"
  5. 5 android:background="@drawable/dialog_bg"
  6. 6 android:orientation="vertical" >
  7. 7
  8. 8 <TextView
  9. 9 android:id="@+id/title"
  10. 10 android:layout_width="wrap_content"
  11. 11 android:layout_height="wrap_content"
  12. 12 android:layout_gravity="center"
  13. 13 android:paddingTop="14dp"
  14. 14 android:textColor="@color/login_hint"
  15. 15 android:textSize="@dimen/text_size_18" />
  16. 16
  17. 17 <LinearLayout
  18. 18 android:layout_width="match_parent"
  19. 19 android:layout_height="wrap_content"
  20. 20 android:layout_marginBottom="14dp"
  21. 21 android:layout_marginLeft="20dp"
  22. 22 android:layout_marginRight="20dp"
  23. 23 android:layout_marginTop="30dp" >
  24. 24
  25. 25 <TextView
  26. 26 android:id="@+id/confirm"
  27. 27 android:layout_width="wrap_content"
  28. 28 android:layout_height="wrap_content"
  29. 29 android:layout_marginRight="10dp"
  30. 30 android:layout_weight="1"
  31. 31 android:background="@drawable/btn_confirm_selector"
  32. 32 android:gravity="center"
  33. 33 android:textColor="@color/white"
  34. 34 android:textSize="@dimen/text_size_16" />
  35. 35
  36. 36 <TextView
  37. 37 android:id="@+id/cancel"
  38. 38 android:layout_width="wrap_content"
  39. 39 android:layout_height="wrap_content"
  40. 40 android:layout_marginLeft="10dp"
  41. 41 android:layout_weight="1"
  42. 42 android:background="@drawable/btn_cancel_selector"
  43. 43 android:gravity="center"
  44. 44 android:textColor="@color/login_hint"
  45. 45 android:textSize="@dimen/text_size_16" />
  46. 46 </LinearLayout>
  47. 47
  48. 48 </LinearLayout>

然后,通过继承Dialog类构建确认弹框控件ConfirmDialog:

  1. 1 package com.corn.widget;
  2. 2
  3. 3 import android.app.Dialog;
  4. 4 import android.content.Context;
  5. 5 import android.os.Bundle;
  6. 6 import android.util.DisplayMetrics;
  7. 7 import android.view.LayoutInflater;
  8. 8 import android.view.View;
  9. 9 import android.view.Window;
  10. 10 import android.view.WindowManager;
  11. 11 import android.widget.TextView;
  12. 12
  13. 13 import com.corn.R;
  14. 14
  15. 15 public class ConfirmDialog extends Dialog {
  16. 16
  17. 17 private Context context;
  18. 18 private String title;
  19. 19 private String confirmButtonText;
  20. 20 private String cacelButtonText;
  21. 21 private ClickListenerInterface clickListenerInterface;
  22. 22
  23. 23 public interface ClickListenerInterface {
  24. 24
  25. 25 public void doConfirm();
  26. 26
  27. 27 public void doCancel();
  28. 28 }
  29. 29
  30. 30 public ConfirmDialog(Context context, String title, String confirmButtonText, String cacelButtonText) {
  31. 31 super(context, R.style.MyDialog);
  32. 32 this.context = context;
  33. 33 this.title = title;
  34. 34 this.confirmButtonText = confirmButtonText;
  35. 35 this.cacelButtonText = cacelButtonText;
  36. 36 }
  37. 37
  38. 38 @Override
  39. 39 protected void onCreate(Bundle savedInstanceState) {
  40. 40 // TODO Auto-generated method stub
  41. 41 super.onCreate(savedInstanceState);
  42. 42
  43. 43 init();
  44. 44 }
  45. 45
  46. 46 public void init() {
  47. 47 LayoutInflater inflater = LayoutInflater.from(context);
  48. 48 View view = inflater.inflate(R.layout.confirm_dialog, null);
  49. 49 setContentView(view);
  50. 50
  51. 51 TextView tvTitle = (TextView) view.findViewById(R.id.title);
  52. 52 TextView tvConfirm = (TextView) view.findViewById(R.id.confirm);
  53. 53 TextView tvCancel = (TextView) view.findViewById(R.id.cancel);
  54. 54
  55. 55 tvTitle.setText(title);
  56. 56 tvConfirm.setText(confirmButtonText);
  57. 57 tvCancel.setText(cacelButtonText);
  58. 58
  59. 59 tvConfirm.setOnClickListener(new clickListener());
  60. 60 tvCancel.setOnClickListener(new clickListener());
  61. 61
  62. 62 Window dialogWindow = getWindow();
  63. 63 WindowManager.LayoutParams lp = dialogWindow.getAttributes();
  64. 64 DisplayMetrics d = context.getResources().getDisplayMetrics(); // 获取屏幕宽、高用
  65. 65 lp.width = (int) (d.widthPixels * 0.8); // 高度设置为屏幕的0.6
  66. 66 dialogWindow.setAttributes(lp);
  67. 67 }
  68. 68
  69. 69 public void setClicklistener(ClickListenerInterface clickListenerInterface) {
  70. 70 this.clickListenerInterface = clickListenerInterface;
  71. 71 }
  72. 72
  73. 73 private class clickListener implements View.OnClickListener {
  74. 74 @Override
  75. 75 public void onClick(View v) {
  76. 76 // TODO Auto-generated method stub
  77. 77 int id = v.getId();
  78. 78 switch (id) {
  79. 79 case R.id.confirm:
  80. 80 clickListenerInterface.doConfirm();
  81. 81 break;
  82. 82 case R.id.cancel:
  83. 83 clickListenerInterface.doCancel();
  84. 84 break;
  85. 85 }
  86. 86 }
  87. 87
  88. 88 };
  89. 89
  90. 90 }

在如上空间构造代码中,由于控件的"确认"和"取消"逻辑与实际的应用场景有关,因此,控件中通过定义内部接口来实现。

在需要使用此控件的地方,进行如下形式调用:

  1. 1 public static void Exit(final Context context) {
  2. 2 final ConfirmDialog confirmDialog = new ConfirmDialog(context, "确定要退出吗?", "退出", "取消");
  3. 3 confirmDialog.show();
  4. 4 confirmDialog.setClicklistener(new ConfirmDialog.ClickListenerInterface() {
  5. 5 @Override
  6. 6 public void doConfirm() {
  7. 7 // TODO Auto-generated method stub
  8. 8 confirmDialog.dismiss();
  9. 9 //toUserHome(context);
  10. 10 AppManager.getAppManager().AppExit(context);
  11. 11 }
  12. 12
  13. 13 @Override
  14. 14 public void doCancel() {
  15. 15 // TODO Auto-generated method stub
  16. 16 confirmDialog.dismiss();
  17. 17 }
  18. 18 });
  19. 19 }

调用中实现了此控件的内部接口,并赋给控件本身,以此在点击按钮时实现基于外部具体业务逻辑的函数回调。

Android自定义Dialog的更多相关文章

  1. Android自定义 Dialog 对话框

    Android自定义Dialoghttp://www.cnblogs.com/and_he/archive/2011/09/16/2178716.html Android使用自定义AlertDialo ...

  2. Android—自定义Dialog

    在 Android 日常的开发中,Dialog 使用是比较广泛的.无论是提示一个提示语,还是确认信息,还是有一定交互的(弹出验证码,输入账号密码登录等等)对话框. 而我们去看一下原生的对话框,虽然随着 ...

  3. Android自定义Dialog(美化界面)

    前言:在做项目的时候,发现dialog界面太丑陋,从csdn上下载了一份自定义dialog的源码,在他的基础上对界面进行美化...有需要的朋友可以直接拿走 效果图如下: 主要代码: /** * 自定义 ...

  4. Android自定义Dialog及其布局

     实际项目开发中默认的Dialog样式无法满足需求,需要自定义Dialog及其布局,并响应布局中控件的事件. 上效果图: 自定义Dialog,LogoutDialog: 要将自定义布局传入构造函数中, ...

  5. android 自定义Dialog背景透明及显示位置设置

    先贴一下显示效果图,仅作参考: 代码如下: 1.自定义Dialog public class SelectDialog extends AlertDialog{ public SelectDialog ...

  6. android 自定义Dialog去除黑色边框

    在自定义Dialog时显示的界面中老是有黑色的边框,下面就介绍使用style去除黑色边框方法. 首先在values/styles定义自定义样式: <style name="MyDial ...

  7. Android 自定义Dialog类,并在Activity中实现按钮监听。

      实际开发中,经常会用到Dialog,比如退出时候会弹出是否退出,或者还有一些编辑框也会用Dialog实现,效果图如下: 开发中遇到的问题无非在于如果在Activity中监听这个Dialog中实现的 ...

  8. Android 自定义Dialog 去除阴影

    自定义Dialog中添加下列代码: window.clearFlags( WindowManager.LayoutParams.FLAG_DIM_BEHIND);

  9. android自定义dialog布局

    dialog使用系统自带的有时候不是很美观,就想要自己来设计一个dialog界面,以下就是可以设计的dialog界面: public class CustomDialog extends Dialog ...

随机推荐

  1. 详解js中的闭包

    前言 在js中,闭包是一个很重要又相当不容易完全理解的要点,网上关于讲解闭包的文章非常多,但是并不是非常容易读懂,在这里以<javascript高级程序设计>里面的理论为基础.用拆分的方式 ...

  2. 转:java多线程--同步容器

    java同步容器 在Java的集合容器框架中,主要有四大类别:List.Set.Queue.Map.List.Set.Queue接口分别继承了Collection接口,Map本身是一个接口.注意Col ...

  3. SSH框架总结(框架分析+环境搭建+实例源码下载)

    来源于: http://blog.csdn.net/shan9liang/article/details/8803989 首先,SSH不是一个框架,而是多个框架(struts+spring+hiber ...

  4. Qt学习思考

    对各个部件基本了解,初步理解GUI应用程序的创建 2D图形文字绘制,3D图形(openGL)等 模型/视图框架编程,处理复杂的数据 多媒体框架 数据库,xml,文件读写等 网络编程 做出比较美观的界面 ...

  5. Java-try-catch-finally

    try-catch语句还可以包括第三部分,就是finally子句.它表示无论是否出现异常,都应当执行的内容.try-catch-finally语句的一般语法形式为: try { // 可能会发生异常的 ...

  6. [Asp.net mvc] 在Asp.net mvc 中使用MiniProfiler

    MiniProfiler是Stack Overflow团队设计的一款性能分析的小程序.可以对一个页面本身,及该页面通过直接引用.Ajax.Iframe形式访问的其它页面进行监控,监控内容包括数据库内容 ...

  7. FooTable高级的响应式表格jQuery插件

    FooTable是一个高级jQuery插件,允许开发者在触屏智能手机及平板电脑等小型设备上制作数据非常惊人的HTML表格.它可以将HTML表转换成可扩展的响应式表格,且通过单击某一行即可将该行数据隐藏 ...

  8. bootstrap table简洁扁平的表格

    使用方法 1.在html页面的head标签中引入Bootstrap库(假如你的项目还没使用)和bootstrap-table.css. <link rel="stylesheet&qu ...

  9. BIEEE 创建多维钻取分析(4)

    在上一节时,我们创建了一个基于部门号的工资分类汇总. 这里就引出了一个概念:维度 专业的解释大家自行百度,这里就不班门弄斧了.从数据的使用角度看,维度可以简单的理解成“数据分类汇总的一种依据”. 按“ ...

  10. 44.Android之Shape设置虚线、圆角和渐变学习

    Shape在Android中设定各种形状,今天记录下,由于比较简单直接贴代码. Shape子属性简单说明一下:  gradient -- 对应颜色渐变. startcolor.endcolor就不多说 ...