摘要:本文主要介绍自定义Dialog中遇到几个技术点,(1)自定义布局;(2)回调函数;(3)点击空白消失
一、自定义布局文件
(1)跟写任何Activity一样,首先自己写一个完整的XML布局文件;
(2)声明一个MyDialog类,继承Dialog,实现View.OnClickListener接口;
(3)以下是MyDialog类中的核心代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置无标题
setCancelable(false); // 设置返回键或点击其他地方,弹窗不会消失
initView(); // 初始化UI
}
private void initView() {
View view = LayoutInflater.from(context).inflate(R.layout.dialog); // 加载布局文件
setContentView(view);
// 在此初始化各种组件
mImg = (ImageView) view.findViewById(R.id.img);
mImg.setOnClickListener(this);
mBtn = (TextView) view.findViewById(R.id.txt);
mBtn.setOnClickListener(this); // 确认按钮,添加回调函数时要用
// 设置弹窗的大小,位置等
Window window = getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
DisplayMetrics d = getResources().getDisplayMetrics(); // 获取屏幕宽、高
lp.width = (int) (d.widthPixels * 0.8); // 宽度设置为屏幕的0.8
lp.gravity = Gravity.CENTER;
window.setAttributes(lp);
window.setBackgroundDrawableResource(android.R.color.transparent); // 解决使用圆角时,但存在四个黑角的问题,需要Dialog的background属性为圆角属性,也能横向填充屏幕
}
(4)经过以上代码,MyDialog终于有了自定义的布局文件了,可以肆意进行任何修改
二、添加回调函数
开发中经常遇到,可以有回调函数的情况,其中包含几个参数,很方便,以下是代码实现
(1)首先,在MyDialog中自定义一个接口,定好方法,参数等
private OnConfirmListener mListener; // 局部变量,调用的就是它
public interface OnConfirmListener { // 定好接口结构
void onFinished(String name, int age);
}
(2)添加回调接口到单击事件中(实现View.OnClickListener接口)
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.txt: // 确认按钮
if (mListener != null) { // 调起接口变量的方法
mListener.onFinished("任意字符串", 10);
}
break;
default:
break;
}
}
(3)添加外界调用的方法,实例化mListener变量
public void show(OnConfirmListener listener) {
this.mListener = listener;
super.show();
}
(4)外部调用情况如下:
mDialog.show(new MyDialog.OnConfirmListener() {
@Override
public void onFinished(String name, int age) {
// 根据回调的参数,添加其他业务逻辑
});
到此,就能够实现了自定义Dialog弹窗的界面,并实现回调函数了
三、点击空白消失
setCanceledOnTouchOutside(true);