Android中自定义弹窗提醒控件

Android中原生的Dialog弹窗提醒控件样式单一,有时候并不能满足我们的项目需求,而且一个工程里面有时候会在多处都用到弹窗提醒的功能,代码会出现大量的冗余,工作之余,就自己实现了这么一个弹窗提醒控件。自定义控件继承自我们的Dialog,样式自定义,弹窗中的文字可通过数组参数初始化,Item个数实现了动态添加,和数组长度一致。对话框底端可展示一个Item(如:确定)或两个Item(如:确定   取消),通过参数设置。废话不多说,直接上代码:

1、自定义对话框的背景样式,在res/values/styles.xml文件中定义如下样式:

[html]   view plain copy
  1. <style name="alertdialog_theme" parent="@android:style/Theme.Dialog">  
  2.     <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->  
  3.     <item name="android:windowIsTranslucent">true</item><!--半透明-->  
  4.     <item name="android:windowNoTitle">true</item><!--无标题-->  
  5.     <item name="android:windowBackground">@color/transparent</item><!--背景透明-->  
  6.     <item name="android:backgroundDimEnabled">true</item><!--模糊-->  
  7. </style>  

2、自定义控件,继承Dialog:

[java]   view plain copy
  1. package com.example.mymenudialog.UI;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.Dialog;  
  6. import android.content.Context;  
  7. import android.graphics.Color;  
  8. import android.util.DisplayMetrics;  
  9. import android.util.TypedValue;  
  10. import android.view.Gravity;  
  11. import android.view.View;  
  12. import android.view.ViewGroup.LayoutParams;  
  13. import android.view.Window;  
  14. import android.view.WindowManager;  
  15. import android.widget.LinearLayout;  
  16. import android.widget.TextView;  
  17.   
  18. import com.example.mymenudialog.R;  
  19.   
  20. /** 
  21.  * @author sunbr 2015.7.16 
  22.  */  
  23. public class MyMenuDialog extends Dialog {  
  24.   
  25.     private static Context mContext;  
  26.     /** 对话框的宽度 */  
  27.     private int dialogWidth;  
  28.     /** 是否设置对话框的最后一行为两个Item(如:确定和取消) */  
  29.     private boolean isTwoItemsOnLastLine = false;  
  30.     /** 是否为倒数第二个Item设置了点击监听事件(只在最后一行显示为两个Item时可用) */  
  31.     private boolean isSetOnClickListener2SecondLastItem = false;  
  32.     /** 是否为最后一个Item设置了点击监听事件 */  
  33.     private boolean isSetOnClickListener2LastItem = false;  
  34.     /** 存放所有Item中的文本信息,文本顺序为从上至下,从左至右 */  
  35.     private ArrayList<TextView> mList = new ArrayList<TextView>();  
  36.     /** 存放所有的分割线,分割线顺序为从上至下,从左至右 */  
  37.     private ArrayList<TextView> mDividerList = new ArrayList<TextView>();  
  38.   
  39.     /** 
  40.      * 自定义对话框的构造方法,将根据names中存放的文本从上至下依次创建Item,每个Item中的文本信息为对应names索引位置的值 
  41.      *  
  42.      * @param context 
  43.      * @param names 
  44.      *            --每条展示的文本信息组成的数组 
  45.      */  
  46.     public MyMenuDialog(Context context, String[] names) {  
  47.         this(context, names, false);  
  48.     }  
  49.   
  50.     /** 
  51.      * 自定义对话框的构造方法,将根据names中存放的文本从上至下依次创建Item,每个Item中的文本信息为对应names索引位置的值 
  52.      *  
  53.      * @param context 
  54.      * @param names 
  55.      *            --每条展示的文本信息组成的数组 
  56.      * @param isLastLine2Items 
  57.      *            --为true时,最后一行将展示为两个Item横向并列的视图(如:一个"确定"和一个"取消");为false时,每行展示一个Item,顺序为从上至下 
  58.      */  
  59.     public MyMenuDialog(Context context, String[] names, boolean isLastLine2Items) {  
  60.         super(context, R.style.alertdialog_theme);  
  61.         this.isTwoItemsOnLastLine = isLastLine2Items;  
  62.         if (null == context || null == names || names.length < 1) {  
  63.             return;  
  64.         }  
  65.         mContext = context;  
  66.         Window w = getWindow();  
  67.         WindowManager wmManager = w.getWindowManager();  
  68.         DisplayMetrics outMetrics = new DisplayMetrics();  
  69.         wmManager.getDefaultDisplay().getMetrics(outMetrics);  
  70.         dialogWidth = outMetrics.widthPixels * 3 / 4;  
  71.         int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, outMetrics);  
  72.         int height1dp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, outMetrics);  
  73.         outMetrics = null;  
  74.         TextView contentView, dividerView;  
  75.         // 定义根部局控件  
  76.         LinearLayout mView = new LinearLayout(context);  
  77.         mView.setBackgroundResource(R.drawable.rectangle_shape);  
  78.         mView.setOrientation(LinearLayout.VERTICAL);  
  79.         // 向根部局文件中添加子控件  
  80.         for (int i = 0; i < names.length; i++) {  
  81.             contentView = new TextView(mContext);  
  82.             dividerView = new TextView(mContext);  
  83.   
  84.             contentView.setPadding(0, padding, 0, padding);  
  85.             contentView.setGravity(Gravity.CENTER);  
  86.             contentView.setText(names[i]);  
  87.             dividerView.setHeight(height1dp);  
  88.             dividerView.setWidth(dialogWidth);  
  89.             if (names.length == 1) {// 只包含1个Item时  
  90.                 contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f);  
  91.                 contentView.setTextColor(Color.rgb(5215857));  
  92.                 contentView.setOnClickListener(new defaultOnClickListener());  
  93.             } else if (names.length == 2) {// 包含两个Item时  
  94.                 if (!isLastLine2Items) {// 如果不是显示到同一行中  
  95.                     if (i == 0) {  
  96.                         contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f);  
  97.                         contentView.setTextColor(Color.rgb(102102102));  
  98.                         dividerView.setBackgroundColor(Color.rgb(198198196));  
  99.                     } else {  
  100.                         contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f);  
  101.                         contentView.setTextColor(Color.rgb(43142240));  
  102.                         contentView.setOnClickListener(new defaultOnClickListener());  
  103.                     }  
  104.                 } else {  
  105.                     makeTextButton(context, padding, height1dp, mView, names[names.length - 2], names[names.length - 1]);  
  106.                     break;  
  107.                 }  
  108.             } else {  
  109.                 if (i == 0) {  
  110.                     contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16f);  
  111.                     contentView.setTextColor(Color.rgb(102102102));  
  112.                     dividerView.setBackgroundColor(Color.rgb(5215857));  
  113.                 } else if (i >= names.length - 2) {  
  114.                     if (!isLastLine2Items) {  
  115.                         if (i == names.length - 1) {  
  116.                             contentView.setTextColor(Color.rgb(5215857));  
  117.                             contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f);  
  118.                             contentView.setOnClickListener(new defaultOnClickListener());  
  119.                         } else {  
  120.                             contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f);  
  121.                             contentView.setTextColor(Color.rgb(43142240));  
  122.                             dividerView.setBackgroundColor(Color.rgb(198198196));  
  123.                         }  
  124.                     } else {  
  125.                         makeTextButton(context, padding, height1dp, mView, names[names.length - 2], names[names.length - 1]);  
  126.                         break;  
  127.                     }  
  128.                 } else {  
  129.                     contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f);  
  130.                     contentView.setTextColor(Color.rgb(43142240));  
  131.                     dividerView.setBackgroundColor(Color.rgb(198198196));  
  132.                 }  
  133.             }  
  134.   
  135.             mView.addView(contentView);  
  136.             mList.add(contentView);  
  137.             if (i != names.length - 1) {  
  138.                 mView.addView(dividerView);  
  139.                 mDividerList.add(dividerView);  
  140.             }  
  141.         }  
  142.   
  143.         setContentView(mView);  
  144.         setCancelable(true);  
  145.         setCanceledOnTouchOutside(true);  
  146.         WindowManager.LayoutParams lp = w.getAttributes();  
  147.         lp.width = dialogWidth;  
  148.     }  
  149.   
  150.     /** 设置最后一行为两个Item横向排列的布局视图 */  
  151.     private void makeTextButton(Context context, int padding, int height1dp, LinearLayout mView, String btn1Text, String btn2Text) {  
  152.         TextView btn_1, btn_spline, btn_2;  
  153.         LinearLayout btnContainer = new LinearLayout(context);  
  154.         LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);  
  155.         params.gravity = Gravity.CENTER;  
  156.         mView.addView(btnContainer, params);  
  157.         btn_1 = new TextView(mContext);  
  158.         btn_1.setPadding(0, padding, 0, padding);  
  159.         btn_1.setText(btn1Text);  
  160.         btn_1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f);  
  161.         btn_1.setTextColor(Color.rgb(5215857));  
  162.         btn_1.setGravity(Gravity.CENTER);  
  163.         LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT);  
  164.         params2.weight = 1;  
  165.         btnContainer.addView(btn_1, params2);  
  166.         btn_spline = new TextView(mContext);  
  167.         LinearLayout.LayoutParams params3 = new LinearLayout.LayoutParams(height1dp, LayoutParams.MATCH_PARENT);  
  168.         btn_spline.setBackgroundColor(Color.rgb(198198196));  
  169.         btnContainer.addView(btn_spline, params3);  
  170.         btn_2 = new TextView(mContext);  
  171.         btn_2.setPadding(0, padding, 0, padding);  
  172.         btn_2.setText(btn2Text);  
  173.         btn_2.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f);  
  174.         btn_2.setTextColor(Color.rgb(5215857));  
  175.         btn_2.setGravity(Gravity.CENTER);  
  176.         LinearLayout.LayoutParams params4 = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT);  
  177.         params4.weight = 1;  
  178.         params4.gravity = Gravity.CENTER;  
  179.         btnContainer.addView(btn_2, params4);  
  180.         mList.add(btn_1);  
  181.         mList.add(btn_2);  
  182.         mDividerList.add(btn_spline);  
  183.   
  184.         btn_1.setOnClickListener(new View.OnClickListener() {  
  185.             @Override  
  186.             public void onClick(View v) {  
  187.                 if (!isSetOnClickListener2SecondLastItem && isShowing()) {  
  188.                     dismiss();  
  189.                 }  
  190.             }  
  191.         });  
  192.         btn_2.setOnClickListener(new defaultOnClickListener());  
  193.   
  194.     }  
  195.   
  196.     /** 
  197.      * 为每个Item中的文字设置填充,单位默认为dp 
  198.      *  
  199.      * @param left 
  200.      *            --左填充 
  201.      * @param top 
  202.      *            --上填充 
  203.      * @param right 
  204.      *            --右填充 
  205.      * @param bottom 
  206.      *            --下填充 
  207.      */  
  208.     public void setPadding2Items(int left, int top, int right, int bottom) {  
  209.         setPadding2Items(left, top, right, bottom, -1);  
  210.     }  
  211.   
  212.     /** 
  213.      * 为每个Item中的文字设置填充 
  214.      *  
  215.      * @param left 
  216.      *            --左填充,单位为 
  217.      * @param top 
  218.      *            --上填充 
  219.      * @param right 
  220.      *            --右填充 
  221.      * @param bottom 
  222.      *            --下填充 
  223.      * @param flagUnit 
  224.      *            --单位:TypedValue.COMPLEX_UNIT_DIP(1)、TypedValue.COMPLEX_UNIT_SP(2)、TypedValue.COMPLEX_UNIT_PX(0) 
  225.      */  
  226.     public void setPadding2Items(int left, int top, int right, int bottom, int flagUnit) {  
  227.         int tmpUnit = TypedValue.COMPLEX_UNIT_DIP;// 单位默认是dp  
  228.         switch (flagUnit) {  
  229.         case TypedValue.COMPLEX_UNIT_SP:  
  230.             tmpUnit = TypedValue.COMPLEX_UNIT_SP;  
  231.             break;  
  232.         case TypedValue.COMPLEX_UNIT_PX:  
  233.             tmpUnit = TypedValue.COMPLEX_UNIT_PX;  
  234.             break;  
  235.         }  
  236.         int tmpLeft = (int) TypedValue.applyDimension(tmpUnit, left, mContext.getResources().getDisplayMetrics());  
  237.         int tmpTop = (int) TypedValue.applyDimension(tmpUnit, top, mContext.getResources().getDisplayMetrics());  
  238.         int tmpRight = (int) TypedValue.applyDimension(tmpUnit, right, mContext.getResources().getDisplayMetrics());  
  239.         int tmpBottom = (int) TypedValue.applyDimension(tmpUnit, bottom, mContext.getResources().getDisplayMetrics());  
  240.         for (int i = 0; i < mList.size(); i++) {  
  241.             mList.get(i).setPadding(tmpLeft, tmpTop, tmpRight, tmpBottom);  
  242.         }  
  243.     }  
  244.   
  245.     /** 
  246.      * 设置对话框的宽度,单位默认为dp 
  247.      *  
  248.      * @param width 
  249.      *            --对话框的宽度 
  250.      */  
  251.     public void setDialogWidth(int width) {  
  252.         setDialogWidth(width, -1);  
  253.     }  
  254.   
  255.     /** 
  256.      * 设置对话框的宽度,当宽度值为屏幕宽度的1/4到屏幕的宽度之间的值时有效 
  257.      *  
  258.      * 注意:对话框的宽度变化时,会相应调整Item中字体的大小为适中,所以要想设置自己想要的字体大小,必须在调用此方法后再次调用设置字体大小的方法 
  259.      *  
  260.      * @param width 
  261.      *            --对话框的宽度 
  262.      * @param unit 
  263.      *            ---宽度的单位:TypedValue.COMPLEX_UNIT_DIP(1)、TypedValue.COMPLEX_UNIT_SP(2)、TypedValue.COMPLEX_UNIT_PX(0) 
  264.      */  
  265.     public void setDialogWidth(int width, int unit) {  
  266.         int tmpUnit = TypedValue.COMPLEX_UNIT_DIP;// 单位默认是dp  
  267.         switch (unit) {  
  268.         case TypedValue.COMPLEX_UNIT_SP:  
  269.             tmpUnit = TypedValue.COMPLEX_UNIT_SP;  
  270.             break;  
  271.         case TypedValue.COMPLEX_UNIT_PX:  
  272.             tmpUnit = TypedValue.COMPLEX_UNIT_PX;  
  273.             break;  
  274.         }  
  275.         width = (int) TypedValue.applyDimension(tmpUnit, width, mContext.getResources().getDisplayMetrics());  
  276.         WindowManager.LayoutParams lp = getWindow().getAttributes();  
  277.         if (width >= dialogWidth / 3 && width <= dialogWidth * 4 / 3) {// 限制对话框的宽度为屏幕宽度的1/4到屏幕宽度  
  278.             lp.width = width;  
  279.             if (width >= dialogWidth / 3 && width < dialogWidth / 2) {  
  280.                 setTextSize(12);  
  281.             } else if (width >= dialogWidth / 2 && width < dialogWidth * 2 / 3) {  
  282.                 setTextSize(14);  
  283.             } else if (width >= dialogWidth * 2 / 3 && width < dialogWidth * 5 / 6) {  
  284.                 setTextSize(16);  
  285.             } else if (width >= dialogWidth * 7 / 6 && width <= dialogWidth * 4 / 3) {  
  286.                 setTextSize(20);  
  287.             }  
  288.         }  
  289.     }  
  290.   
  291.     private void setTextSize(int size) {  
  292.         for (int i = 0; i < mList.size(); i++) {  
  293.             mList.get(i).setTextSize(TypedValue.COMPLEX_UNIT_SP, size);  
  294.         }  
  295.         if (mList.size() > 2) {  
  296.             mList.get(0).setTextSize(TypedValue.COMPLEX_UNIT_SP, size - 2);  
  297.         }  
  298.     }  
  299.   
  300.     /** 
  301.      * 设置对话框中字体颜色,所有item中的字体颜色均设置为color所表示的颜色 
  302.      *  
  303.      * @param color 
  304.      */  
  305.     public void setTextColor2AllItems(int color) {  
  306.         for (int i = 0; i < mList.size(); i++) {  
  307.             mList.get(i).setTextColor(color);  
  308.         }  
  309.     }  
  310.   
  311.     /** 
  312.      * 为指定Item中的文字设置颜色 
  313.      *  
  314.      * @param color 
  315.      * @param itemIndex 
  316.      *            --指定Item的索引,从1开始,即第一个Item的itemIndex=1 
  317.      */  
  318.     public void setTextColor2Item(int color, int itemIndex) {  
  319.         if (color < 0 || itemIndex < 1 || itemIndex > mList.size()) {  
  320.             return;  
  321.         }  
  322.         mList.get(itemIndex - 1).setTextColor(color);  
  323.     }  
  324.   
  325.     /** 
  326.      * 设置对话框中字体颜色,color中的颜色顺序和item的顺序一致, 
  327.      *  
  328.      * 当给定数组color长度小于item数的时候,只设置前color.length个item的字体颜色; 
  329.      *  
  330.      * 当color长度大于item数的时候,只将color的前item数个颜色值依次设置给item的字体; 
  331.      *  
  332.      * 如果想跳过中间的某个Item不为其设置颜色的话,可将color中该Item对应的值设置为-1 
  333.      *  
  334.      * @param color 
  335.      */  
  336.     public void setTextColor2Items(int[] color) {  
  337.         if (null == color || color.length == 0) {  
  338.             return;  
  339.         }  
  340.         for (int i = 0; i < color.length && i < mList.size(); i++) {  
  341.             if (color[i] != -1) {  
  342.                 mList.get(i).setTextColor(color[i]);  
  343.             }  
  344.         }  
  345.     }  
  346.   
  347.     /** 
  348.      * 设置对话框中分割线的颜色,所有分割线的颜色均设置为color所表示的颜色 
  349.      *  
  350.      * @param color 
  351.      */  
  352.     public void setColor2DividerLine(int color) {  
  353.         for (int i = 0; i < mDividerList.size(); i++) {  
  354.             mDividerList.get(i).setBackgroundColor(color);  
  355.         }  
  356.     }  
  357.   
  358.     /** 
  359.      * 为指定分割线设置颜色, 
  360.      *  
  361.      * @param color 
  362.      * @param itemIndex 
  363.      *            --指定分割线的索引,从1开始,即第一个分割线的itemIndex=1,分割线的索引顺序为从上至下,从左至右;每个item下都有一个分割线(最后一个除外),如果最后一行设置为两个Item,则两个Item中间的分割线也算一个) 
  364.      */  
  365.     public void setColor2DividerLine(int color, int dividerLineIndex) {  
  366.         if (color < 0 || dividerLineIndex < 1 || dividerLineIndex > mDividerList.size()) {  
  367.             return;  
  368.         }  
  369.         mDividerList.get(dividerLineIndex - 1).setBackgroundColor(color);  
  370.     }  
  371.   
  372.     /** 
  373.      * 设置对话框中分割线的颜色,color中的颜色顺序和分割线的顺序(从上至下,从左至右)一致(每个item下都有一个分割线,最后一个除外;如果最后一行设置为两个Item,则两个Item中间的分割线也算一个), 
  374.      *  
  375.      * 当给定数组color长度小于分割线数的时候,只设置前color.length个分割线的颜色; 
  376.      *  
  377.      * 当color长度大于分割线数的时候,只将color的前分割线数个颜色值依次设置给分割线; 
  378.      *  
  379.      * 如果想跳过中间的某个分割线不为其设置颜色的话,可将color中该分割线对应的值设置为-1 
  380.      *  
  381.      * @param color 
  382.      */  
  383.     public void setColor2DividerLine(int[] color) {  
  384.         if (null == color || color.length == 0) {  
  385.             return;  
  386.         }  
  387.         for (int i = 0; i < color.length && i < mDividerList.size(); i++) {  
  388.             if (color[i] != -1) {  
  389.                 mDividerList.get(i).setBackgroundColor(color[i]);  
  390.             }  
  391.         }  
  392.     }  
  393.   
  394.     /** 
  395.      * 为对话框中的Item设置点击的监听事件,listeners的顺序与item的顺序一致, 
  396.      *  
  397.      * 当给定数组listeners长度小于item数的时候,只设置前listeners.length个item的点击监听事件; 
  398.      *  
  399.      * 当listeners长度大于item数的时候,只将listeners的前item数个点击监听事件依次设置给item的点击监听; 
  400.      *  
  401.      * 如果想跳过中间的某个Item不为其设置点击监听事件的话,可将listeners中该Item对应的值设置为null; 
  402.      *  
  403.      * 另,如果不为最后一个Item设置点击监听的话,其会有一个默认的点击事件,该点击事件执行隐藏当前对话框的操作, 如果将最后一行设置成了两个Item,则如果没有为其设置点击监听的话,其默认也执行隐藏当前对话框的操作 
  404.      *  
  405.      *  
  406.      * @param listeners 
  407.      */  
  408.     public void setOnClickListener2Items(View.OnClickListener[] listeners) {  
  409.         if (listeners == null || listeners.length == 0) {  
  410.             return;  
  411.         }  
  412.         for (int i = 0; i < listeners.length && i < mList.size(); i++) {  
  413.             if (listeners[i] != null) {  
  414.                 mList.get(i).setOnClickListener(listeners[i]);  
  415.             }  
  416.         }  
  417.   
  418.         if (listeners.length < mList.size() || listeners[listeners.length - 1] == null) {  
  419.             isSetOnClickListener2LastItem = false;  
  420.             if (isTwoItemsOnLastLine && (listeners.length < mList.size() - 1 || (listeners.length > 1 && listeners[listeners.length - 2] == null))) {  
  421.                 isSetOnClickListener2SecondLastItem = true;  
  422.             }  
  423.         } else {  
  424.             isSetOnClickListener2LastItem = true;  
  425.         }  
  426.   
  427.     }  
  428.   
  429.     /** 
  430.      * 为最后一个Item设置点击监听 
  431.      *  
  432.      * @param listener 
  433.      */  
  434.     public void setOnClickListener2LastItem(View.OnClickListener listener) {  
  435.         if (listener == null) {  
  436.             return;  
  437.         }  
  438.         if (null != mList && mList.size() > 0) {  
  439.             mList.get(mList.size() - 1).setOnClickListener(listener);  
  440.             isSetOnClickListener2LastItem = true;  
  441.         }  
  442.     }  
  443.   
  444.     /** 
  445.      * 为倒数第二个Item设置点击监听 
  446.      *  
  447.      * @param listener 
  448.      */  
  449.     public void setOnClickListener2SecondLastItem(View.OnClickListener listener) {  
  450.         if (listener == null) {  
  451.             return;  
  452.         }  
  453.         if (null != mList && mList.size() > 1) {  
  454.             mList.get(mList.size() - 2).setOnClickListener(listener);  
  455.             isSetOnClickListener2SecondLastItem = true;  
  456.         }  
  457.     }  
  458.   
  459.     /** 
  460.      * 为指定Item设置点击监听 
  461.      *  
  462.      * @param listener 
  463.      * @param itemIndex 
  464.      *            --指定Item的索引,从1开始,即第一个Item的itemIndex=1 
  465.      */  
  466.     public void setOnClickListener2Item(View.OnClickListener listener, int itemIndex) {  
  467.         if (listener == null || itemIndex < 1 || itemIndex > mList.size()) {  
  468.             return;  
  469.         }  
  470.         if (null != mList) {  
  471.             mList.get(itemIndex - 1).setOnClickListener(listener);  
  472.             if (itemIndex == mList.size()) {  
  473.                 isSetOnClickListener2LastItem = true;  
  474.             } else if (itemIndex == mList.size() - 1) {  
  475.                 isSetOnClickListener2SecondLastItem = true;  
  476.             }  
  477.         }  
  478.     }  
  479.   
  480.     /** 
  481.      * 为最后两个Item设置点击监听 
  482.      *  
  483.      * @param listener 
  484.      * @param itemIndex 
  485.      *            --指定Item的索引,从1开始,即第一个Item的itemIndex=1 
  486.      */  
  487.     public void setOnClickListener2LastTwoItems(final OnClickListener2LastTwoItem listener) {  
  488.         if (listener == null) {  
  489.             return;  
  490.         }  
  491.         if (null != mList && mList.size() >= 2) {  
  492.             isSetOnClickListener2LastItem = true;  
  493.             isSetOnClickListener2SecondLastItem = true;  
  494.             mList.get(mList.size() - 1).setOnClickListener(new View.OnClickListener() {  
  495.                 @Override  
  496.                 public void onClick(View v) {  
  497.                     listener.onClickListener2LastItem();  
  498.                 }  
  499.             });  
  500.             mList.get(mList.size() - 2).setOnClickListener(new View.OnClickListener() {  
  501.                 @Override  
  502.                 public void onClick(View v) {  
  503.                     listener.onClickListener2SecondLastItem();  
  504.                 }  
  505.             });  
  506.         }  
  507.     }  
  508.   
  509.     /** 
  510.      * 最后两个Item的点击回调接口 
  511.      */  
  512.     public interface OnClickListener2LastTwoItem {  
  513.         /** 最后一个Item的点击监听回调方法 */  
  514.         void onClickListener2LastItem();  
  515.   
  516.         /** 倒数第二个Item的点击监听回调方法 */  
  517.         void onClickListener2SecondLastItem();  
  518.     }  
  519.   
  520.     /** 
  521.      * 默认的点击事件 
  522.      */  
  523.     private class defaultOnClickListener implements View.OnClickListener {  
  524.         @Override  
  525.         public void onClick(View v) {  
  526.             if (!isSetOnClickListener2LastItem) {  
  527.                 if (isShowing()) {  
  528.                     dismiss();  
  529.                 }  
  530.             }  
  531.         }  
  532.     }  
  533.   
  534. }  

3、在Activity中使用自定义对话框:

[java]   view plain copy
  1. package com.example.mymenudialog;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.TextView;  
  8.   
  9. import com.example.mymenudialog.UI.MyMenuDialog;  
  10. import com.example.mymenudialog.UI.MyMenuDialog.OnClickListener2LastTwoItem;  
  11.   
  12. public class MainActivity extends Activity {  
  13.   
  14.     private TextView tv_msg;  
  15.     private MyMenuDialog dialog;  
  16.   
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.activity_main);  
  21.         tv_msg = (TextView) findViewById(R.id.tv_msg);  
  22.   
  23.         String[] names = { "温馨提示""正在建设中""确定""取消" };  
  24.         dialog = new MyMenuDialog(this, names, true);  
  25.         // dialog.setPadding2Items(0,10, 0, 10);//设置Item中文本的填充  
  26.         // dialog.setDialogWidth(100);//设置对话框的宽度  
  27.         dialog.setOnClickListener2LastTwoItems(new OnClickListener2LastTwoItem() {  
  28.             @Override  
  29.             public void onClickListener2SecondLastItem() {  
  30.                 tv_msg.setText("点击了确定");  
  31.                 dialog.dismiss();  
  32.             }  
  33.   
  34.             @Override  
  35.             public void onClickListener2LastItem() {  
  36.                 tv_msg.setText("点击了取消");  
  37.                 dialog.dismiss();  
  38.             }  
  39.         });  
  40.   
  41.         findViewById(R.id.btn_click).setOnClickListener(new OnClickListener() {  
  42.             @Override  
  43.             public void onClick(View v) {  
  44.                 dialog.show();  
  45.             }  
  46.         });  
  47.     }  
  48. }  


下面看效果图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值