android自定义xml弹窗,Android自定义弹窗提醒控件使用详解

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值