Android自定义弹窗提醒控件使用详解自定义弹窗提醒控件使用详解
主要为大家详细介绍了Android自定义弹窗提醒控件的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Android中原生的Dialog弹窗提醒控件样式单一,有时候并不能满足我们的项目需求,而且一个工程里面有时候会在多处都用到弹窗提醒的功能,代码会出现大量的冗余,工作之余,就自
己实现了这么一个弹窗提醒控件。自定义控件继承自我们的Dialog,样式自定义,弹窗中的文字可通过数组参数初始化,Item个数实现了动态添加,和数组长度一致。对话框底端可展示
一个Item(如:确定)或两个Item(如:确定 取消),通过参数设置。废话不多说,直接上代码:
1、自定义对话框的背景样式,在res/values/styles.xml文件中定义如下样式:
<style name="alertdialog_theme" parent="@android:style/Theme.Dialog">
<item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
<item name="android:windowIsTranslucent">true</item><!--半透明-->
<item name="android:windowNoTitle">true</item><!--无标题-->
<item name="android:windowBackground">@color/transparent</item><!--背景透明-->
<item name="android:backgroundDimEnabled">true</item><!--模糊-->
</style>
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<TextView> mList = new ArrayList<TextView>();
/** 存放所有的分割线,分割线顺序为从上至下,从左至右 */
private ArrayList<TextView> mDividerList = new ArrayList<TextView>();
/**
* 自定义对话框的构造方法,将根据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.setTextColor(Color.rgb(102, 102, 102));