Android中原生的Dialog弹窗提醒控件样式单一,有时候并不能满足我们的项目需求,而且一个工程里面有时候会在多处都用到弹窗提醒的功能,代码会出现大量的冗余,工作之余,就自己实现了这么一个弹窗提醒控件。自定义控件继承自我们的Dialog,样式自定义,弹窗中的文字可通过数组参数初始化,Item个数实现了动态添加,和数组长度一致。对话框底端可展示一个Item(如:确定)或两个Item(如:确定 取消),通过参数设置。废话不多说,直接上代码:
1、自定义对话框的背景样式,在res/values/styles.xml文件中定义如下样式:
true
true
true
@color/transparent
true
2、自定义控件,继承Dialog:
package com.example.mymenudialog.UI;
import java.util.ArrayList;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.mymenudialog.R;
/**
* @author sunbr 2015.7.16
*/
public class MyMenuDialog extends Dialog {
private static Context mContext;
/** 对话框的宽度 */
private int dialogWidth;
/** 是否设置对话框的最后一行为两个Item(如:确定和取消) */
private boolean isTwoItemsOnLastLine = false;
/** 是否为倒数第二个Item设置了点击监听事件(只在最后一行显示为两个Item时可用) */
private boolean isSetOnClickListener2SecondLastItem = false;
/** 是否为最后一个Item设置了点击监听事件 */
private boolean isSetOnClickListener2LastItem = false;
/** 存放所有Item中的文本信息,文本顺序为从上至下,从左至右 */
private ArrayList mList = new ArrayList();
/** 存放所有的分割线,分割线顺序为从上至下,从左至右 */
private ArrayList mDividerList = new ArrayList();
/**
* 自定义对话框的构造方法,将根据names中存放的文本从上至下依次创建Item,每个Item中的文本信息为对应names索引位置的值
*
* @param context
* @param names
* --每条展示的文本信息组成的数组
*/
public MyMenuDialog(Context context, String[] names) {
this(context, names, false);
}
/**
* 自定义对话框的构造方法,将根据names中存放的文本从上至下依次创建Item,每个Item中的文本信息为对应names索引位置的值
*
* @param context
* @param names
* --每条展示的文本信息组成的数组
* @param isLastLine2Items
* --为true时,最后一行将展示为两个Item横向并列的视图(如:一个"确定"和一个"取消");为false时,每行展示一个Item,顺序为从上至下
*/
public MyMenuDialog(Context context, String[] names, boolean isLastLine2Items) {
super(context, R.style.alertdialog_theme);
this.isTwoItemsOnLastLine = isLastLine2Items;
if (null == context || null == names || names.length < 1) {
return;
}
mContext = context;
Window w = getWindow();
WindowManager wmManager = w.getWindowManager();
DisplayMetrics outMetrics = new DisplayMetrics();
wmManager.getDefaultDisplay().getMetrics(outMetrics);
dialogWidth = outMetrics.widthPixels * 3 / 4;
int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, outMetrics);
int height1dp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, outMetrics);
outMetrics = null;
TextView contentView, dividerView;
// 定义根部局控件
LinearLayout mView = new LinearLayout(context);
mView.setBackgroundResource(R.drawable.rectangle_shape);
mView.setOrientation(LinearLayout.VERTICAL);
// 向根部局文件中添加子控件
for (int i = 0; i < names.length; i++) {
contentView = new TextView(mContext);
dividerView = new TextView(mContext);
contentView.setPadding(0, padding, 0, padding);
contentView.setGravity(Gravity.CENTER);
contentView.setText(names[i]);
dividerView.setHeight(height1dp);
dividerView.setWidth(dialogWidth);
if (names.length == 1) {// 只包含1个Item时
contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f);
contentView.setTextColor(Color.rgb(52, 158, 57));
contentView.setOnClickListener(new defaultOnClickListener());
} else if (names.length == 2) {// 包含两个Item时
if (!isLastLine2Items) {// 如果不是显示到同一行中
if (i == 0) {
contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f);
contentView.setTextCol