版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中自定义一个弹窗提醒控件
怎么在Android中自定义一个弹窗提醒控件?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面在下将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。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));
dividerView.setBackgroundColor(Color.rgb(198,
198,
196));
}
else
{
contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP,
18f);
contentView.setTextColor(Color.rgb(43,
142,
240));
contentView.setOnClickListener(new
defaultOnClickListener());
}
}
else
{
makeTextButton(context,
padding,
height1dp,
mView,
names[names.length
-
2],
names[names.length
-
1]);
break;
}
}
else
{
if
(i
==
0)
{
contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP,
16f);
contentView.setTextColor(Color.rgb(102,
102,
102));
dividerView.setBackgroundColor(Color.rgb(52,
158,
57));
}
else
if
(i
>=
names.length
-
2)
{
if
(!isLastLine2Items)
{
if
(i
==
names.length
-
1)
{
contentView.setTextColor(Color.rgb(52,
158,
57));
contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP,
18f);
contentView.setOnClickListener(new
defaultOnClickListener());
}
else
{
contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP,
18f);
contentView.setTextColor(Color.rgb(43,
142,
240));
dividerView.setBackgroundColor(Color.rgb(198,
198,
196));
}
}
else
{
makeTextButton(context,
padding,
height1dp,
mView,
names[names.length
-
2],
names[names.length
-
1]);
break;
}
}
else
{
contentView.setTextSize(TypedValue.COMPLEX_UNIT_SP,
18f);
contentView.setTextColor(Color.rgb(43,
142,
240));
dividerView.setBackgroundColor(Color.rgb(198,
198,
196));
}
}
mView.addView(contentView);
mList.add(contentView);
if
(i
!=
names.length
-
1)
{
mView.addView(dividerView);
mDividerList.add(dividerView);
}
}
setContentView(mView);
setCancelable(true);
setCanceledOnTouchOutside(true);
WindowManager.LayoutParams
lp
=
w.getAttributes();
lp.width
=
dialogWidth;
}
/**
设置最后一行为两个Item横向排列的布局视图
*/
private
void
makeTextButton(Context
context,
int
padding,
int
height1dp,
LinearLayout
mView,
String
btn1Text,
String
btn2Text)
{
TextView
btn_1,
btn_spline,
btn_2;
LinearLayout
btnContainer
=
new
LinearLayout(context);
LinearLayout.LayoutParams
params
=
new
LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT);
params.gravity
=
Gravity.CENTER;
mView.addView(btnContainer,
params);
btn_1
=
new
TextView(mContext);
btn_1.setPadding(0,
padding,
0,
padding);
btn_1.setText(btn1Text);
btn_1.setTextSize(TypedValue.COMPLEX_UNIT_SP,
18f);
btn_1.setTextColor(Color.rgb(52,
158,
57));
btn_1.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams
params2
=
new
LinearLayout.LayoutParams(0,
LayoutParams.WRAP_CONTENT);
params2.weight
=
1;
btnContainer.addView(btn_1,
params2);
btn_spline
=
new
TextView(mContext);
LinearLayout.LayoutParams
params3
=
new
LinearLayout.LayoutParams(height1dp,
LayoutParams.MATCH_PARENT);
btn_spline.setBackgroundColor(Color.rgb(198,
198,
196));
btnContainer.addView(btn_spline,
params3);
btn_2
=
new
TextView(mContext);
btn_2.setPadding(0,
padding,
0,
padding);
btn_2.setText(btn2Text);
btn_2.setTextSize(TypedValue.COMPLEX_UNIT_SP,
18f);
btn_2.setTextColor(Color.rgb(52,
158,
57));
btn_2.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams
params4
=
new
LinearLayout.LayoutParams(0,
LayoutParams.WRAP_CONTENT);
params4.weight
=
1;
params4.gravity
=
Gravity.CENTER;
btnContainer.addView(btn_2,
params4);
mList.add(btn_1);
mList.add(btn_2);
mDividerList.add(btn_spline);
btn_1.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
v)
{
if
(!isSetOnClickListener2SecondLastItem
&&
isShowing())
{
dismiss();
}
}
});
btn_2.setOnClickListener(new
defaultOnClickListener());
}
/**
*
为每个Item中的文字设置填充,单位默认为dp
*
*
@param
left
*
--左填充
*
@param
top
*
--上填充
*
@param
right
*
--右填充
*
@param
bottom
*
--下填充
*/
public
void
setPadding2Items(int
left,
int
top,
int
right,
int
bottom)
{
setPadding2Items(left,
top,
right,
bottom,
-1);
}
/**
*
为每个Item中的文字设置填充
*
*
@param
left
*
--左填充,单位为
*
@param
top
*
--上填充
*
@param
right
*
--右填充
*
@param
bottom
*
--下填充
*
@param
flagUnit
*
--单位:TypedValue.COMPLEX_UNIT_DIP(1)、TypedValue.COMPLEX_UNIT_SP(2)、TypedValue.COMPLEX_UNIT_PX(0)
*/
public
void
setPadding2Items(int
left,
int
top,
int
right,
int
bottom,
int
flagUnit)
{
int
tmpUnit
=
TypedValue.COMPLEX_UNIT_DIP;//
单位默认是dp
switch
(flagUnit)
{
case
TypedValue.COMPLEX_UNIT_SP:
tmpUnit
=
TypedValue.COMPLEX_UNIT_SP;
break;
case
TypedValue.COMPLEX_UNIT_PX:
tmpUnit
=
TypedValue.COMPLEX_UNIT_PX;
break;
}
int
tmpLeft
=
(int)
TypedValue.applyDimension(tmpUnit,
left,
mContext.getResources().getDisplayMetrics());
int
tmpTop
=
(int)
TypedValue.applyDimension(tmpUnit,
top,
mContext.getResources().getDisplayMetrics());
int
tmpRight
=
(int)
TypedValue.applyDimension(tmpUnit,
right,
mContext.getResources().getDisplayMetrics());
int
tmpBottom
=
(int)
TypedValue.applyDimension(tmpUnit,
bottom,
mContext.getResources().getDisplayMetrics());
for
(int
i
=
0;
i
<
mList.size();
i++)
{
mList.get(i).setPadding(tmpLeft,
tmpTop,
tmpRight,
tmpBottom);
}
}
/**
*
设置对话框的宽度,单位默认为dp
*
*
@param
width
*
--对话框的宽度
*/
public
void
setDialogWidth(int
width)
{
setDialogWidth(width,
-1);
}
/**
*
设置对话框的宽度,当宽度值为屏幕宽度的1/4到屏幕的宽度之间的值时有效
*
*
注意:对话框的宽度变化时,会相应调整Item中字体的大小为适中,所以要想设置自己想要的字体大小,必须在调用此方法后再次调用设置字体大小的方法
*
*
@param
width
*
--对话框的宽度
*
@param
unit
*
宽度的单位:TypedValue.COMPLEX_UNIT_DIP(1)、TypedValue.COMPLEX_UNIT_SP(2)、TypedValue.COMPLEX_UNIT_PX(0)
*/
public
void
setDialogWidth(int
width,
int
unit)
{
int
tmpUnit
=
TypedValue.COMPLEX_UNIT_DIP;//
单位默认是dp
switch
(unit)
{
case
TypedValue.COMPLEX_UNIT_SP:
tmpUnit
=
TypedValue.COMPLEX_UNIT_SP;
break;
case
TypedValue.COMPLEX_UNIT_PX:
tmpUnit
=
TypedValue.COMPLEX_UNIT_PX;
break;
}
width
=
(int)
TypedValue.applyDimension(tmpUnit,
width,
mContext.getResources().getDisplayMetrics());
WindowManager.LayoutParams
lp
=
getWindow().getAttributes();
if
(width
>=
dialogWidth
/
3
&&
width
<=
dialogWidth
*
4
/
3)
{//
限制对话框的宽度为屏幕宽度的1/4到屏幕宽度
lp.width
=
width;
if
(width
>=
dialogWidth
/
3
&&
width
<
dialogWidth
/
2)
{
setTextSize(12);
}
else
if
(width
>=
dialogWidth
/
2
&&
width
<
dialogWidth
*
2
/
3)
{
setTextSize(14);
}
else
if
(width
>=
dialogWidth
*
2
/
3
&&
width
<
dialogWidth
*
5
/
6)
{
setTextSize(16);
}
else
if
(width
>=
dialogWidth
*
7
/
6
&&
width
<=
dialogWidth
*
4
/
3)
{
setTextSize(20);
}
}
}
private
void
setTextSize(int
size)
{
for
(int
i
=
0;
i
<
mList.size();
i++)
{
mList.get(i).setTextSize(TypedValue.COMPLEX_UNIT_SP,
size);
}
if
(mList.size()
>
2)
{
mList.get(0).setTextSize(TypedValue.COMPLEX_UNIT_SP,
size
-
2);
}
}
/**
*
设置对话框中字体颜色,所有item中的字体颜色均设置为color所表示的颜色
*
*
@param
color
*/
public
void
setTextColor2AllItems(int
color)
{
for
(int
i
=
0;
i
<
mList.size();
i++)
{
mList.get(i).setTextColor(color);
}
}
/**
*
为指定Item中的文字设置颜色
*
*
@param
color
*
@param
itemIndex
*
--指定Item的索引,从1开始,即第一个Item的itemIndex=1
*/
public
void
setTextColor2Item(int
color,
int
itemIndex)
{
if
(color
<
0
||
itemIndex
<
1
||
itemIndex
>
mList.size())
{
return;
}
mList.get(itemIndex
-
1).setTextColor(color);
}
/**
*
设置对话框中字体颜色,color中的颜色顺序和item的顺序一致,
*
*
当给定数组color长度小于item数的时候,只设置前color.length个item的字体颜色;
*
*
当color长度大于item数的时候,只将color的前item数个颜色值依次设置给item的字体;
*
*
如果想跳过中间的某个Item不为其设置颜色的话,可将color中该Item对应的值设置为-1
*
*
@param
color
*/
public
void
setTextColor2Items(int[]
color)
{
if
(null
==
color
||
color.length
==
0)
{
return;
}
for
(int
i
=
0;
i
<
color.length
&&
i
<
mList.size();
i++)
{
if
(color[i]
!=
-1)
{
mList.get(i).setTextColor(color[i]);
}
}
}
/**
*
设置对话框中分割线的颜色,所有分割线的颜色均设置为color所表示的颜色
*
*
@param
color
*/
public
void
setColor2DividerLine(int
color)
{
for
(int
i
=
0;
i
<
mDividerList.size();
i++)
{
mDividerList.get(i).setBackgroundColor(color);
}
}
/**
*
为指定分割线设置颜色,
*
*
@param
color
*
@param
itemIndex
*
--指定分割线的索引,从1开始,即第一个分割线的itemIndex=1,分割线的索引顺序为从上至下,从左至右;每个item下都有一个分割线(最后一个除外),如果最后一行设置为两个Item,则两个Item中间的分割线也算一个)
*/
public
void
setColor2DividerLine(int
color,
int
dividerLineIndex)
{
if
(color
<
0
||
dividerLineIndex
<
1
||
dividerLineIndex
>
mDividerList.size())
{
return;
}
mDividerList.get(dividerLineIndex
-
1).setBackgroundColor(color);
}
/**
*
设置对话框中分割线的颜色,color中的颜色顺序和分割线的顺序(从上至下,从左至右)一致(每个item下都有一个分割线,最后一个除外;如果最后一行设置为两个Item,则两个Item中间的分割线也算一个),
*
*
当给定数组color长度小于分割线数的时候,只设置前color.length个分割线的颜色;
*
*
当color长度大于分割线数的时候,只将color的前分割线数个颜色值依次设置给分割线;
*
*
如果想跳过中间的某个分割线不为其设置颜色的话,可将color中该分割线对应的值设置为-1
*
*
@param
color
*/
public
void
setColor2DividerLine(int[]
color)
{
if
(null
==
color
||
color.length
==
0)
{
return;
}
for
(int
i
=
0;
i
<
color.length
&&
i
<
mDividerList.size();
i++)
{
if
(color[i]
!=
-1)
{
mDividerList.get(i).setBackgroundColor(color[i]);
}
}
}
/**
*
为对话框中的Item设置点击的监听事件,listeners的顺序与item的顺序一致,
*
*
当给定数组listeners长度小于item数的时候,只设置前listeners.length个item的点击监听事件;
*
*
当listeners长度大于item数的时候,只将listeners的前item数个点击监听事件依次设置给item的点击监听;
*
*
如果想跳过中间的某个Item不为其设置点击监听事件的话,可将listeners中该Item对应的值设置为null;
*
*
另,如果不为最后一个Item设置点击监听的话,其会有一个默认的点击事件,该点击事件执行隐藏当前对话框的操作,
如果将最后一行设置成了两个Item,则如果没有为其设置点击监听的话,其默认也执行隐藏当前对话框的操作
*
*
*
@param
listeners
*/
public
void
setOnClickListener2Items(View.OnClickListener[]
listeners)
{
if
(listeners
==
null
||
listeners.length
==
0)
{
return;
}
for
(int
i
=
0;
i
<
listeners.length
&&
i
<
mList.size();
i++)
{
if
(listeners[i]
!=
null)
{
mList.get(i).setOnClickListener(listeners[i]);
}
}
if
(listeners.length
<
mList.size()
||
listeners[listeners.length
-
1]
==
null)
{
isSetOnClickListener2LastItem
=
false;
if
(isTwoItemsOnLastLine
&&
(listeners.length
<
mList.size()
-
1
||
(listeners.length
>
1
&&
listeners[listeners.length
-
2]
==
null)))
{
isSetOnClickListener2SecondLastItem
=
true;
}
}
else
{
isSetOnClickListener2LastItem
=
true;
}
}
/**
*
为最后一个Item设置点击监听
*
*
@param
listener
*/
public
void
setOnClickListener2LastItem(View.OnClickListener
listener)
{
if
(listener
==
null)
{
return;
}
if
(null
!=
mList
&&
mList.size()
>
0)
{
mList.get(mList.size()
-
1).setOnClickListener(listener);
isSetOnClickListener2LastItem
=
true;
}
}
/**
*
为倒数第二个Item设置点击监听
*
*
@param
listener
*/
public
void
setOnClickListener2SecondLastItem(View.OnClickListener
listener)
{
if
(listener
==
null)
{
return;
}
if
(null
!=
mList
&&
mList.size()
>
1)
{
mList.get(mList.size()
-
2).setOnClickListener(listener);
isSetOnClickListener2SecondLastItem
=
true;
}
}
/**
*
为指定Item设置点击监听
*
*
@param
listener
*
@param
itemIndex
*
--指定Item的索引,从1开始,即第一个Item的itemIndex=1
*/
public
void
setOnClickListener2Item(View.OnClickListener
listener,
int
itemIndex)
{
if
(listener
==
null
||
itemIndex
<
1
||
itemIndex
>
mList.size())
{
return;
}
if
(null
!=
mList)
{
mList.get(itemIndex
-
1).setOnClickListener(listener);
if
(itemIndex
==
mList.size())
{
isSetOnClickListener2LastItem
=
true;
}
else
if
(itemIndex
==
mList.size()
-
1)
{
isSetOnClickListener2SecondLastItem
=
true;
}
}
}
/**
*
为最后两个Item设置点击监听
*
*
@param
listener
*
@param
itemIndex
*
--指定Item的索引,从1开始,即第一个Item的itemIndex=1
*/
public
void
setOnClickListener2LastTwoItems(final
OnClickListener2LastTwoItem
listener)
{
if
(listener
==
null)
{
return;
}
if
(null
!=
mList
&&
mList.size()
>=
2)
{
isSetOnClickListener2LastItem
=
true;
isSetOnClickListener2SecondLastItem
=
true;
mList.get(mList.size()
-
1).setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
v)
{
listener.onClickListener2LastItem();
}
});
mList.get(mList.size()
-
2).setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
v)
{
listener.onClickListener2SecondLastItem();
}
});
}
}
/**
*
最后两个Item的点击回调接口
*/
public
interface
OnClickLi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年永胜县小学六年级语文毕业检测指导卷含答案
- 工程合同补充协议书12篇 工程合同补充协议书12篇
- 离婚协议中的财产分割方法解析
- 离婚协议的财产赔偿对策
- 离婚协议的经济抚养细则
- 离婚协议的内容设置要求
- 离婚协议分和不分
- 2024年住院医师考试-麻醉科住院医师笔试参考题库含答案
- 离婚协议和平解决婚姻矛盾
- 离婚协议的解释规则
- 伤寒杂病论白话文
- 型钢悬挑水平防护棚专项施工方案
- 最新事业部管理制度
- 常住人口登记卡模板
- 北师大版一年级下学期数学《期中考试卷》附答案
- 华师大版数学八年级下学期《期中检测试卷》附答案解析
- 工程竞争性谈判资料(全套)
- 超细复合矿物掺合料项目行业调研分析报告
- GPC基础知识指南
- 家畜育种规划育种的组织和措施ppt课件
- 50t门式起重机拆除施工方案[全面]
评论
0/150
提交评论