今天有空把自定义弹出框研究了一下,一直在用,都没有仔细的看代码,今儿mark一下。
先上个图,做出来的效果:
Step 1: 先自定义一个显示图,
我写的XML文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/window_bg">
<TextView
android:id="@+id/message"
android:layout_width="150dp"
android:layout_height="40dp"
android:gravity="center"
android:text="提示信息"
android:textColor="#333333"
android:textSize="21dp" />
<View
android:layout_width="fill_parent"
android:layout_height="2dip"
android:background="#FF909090" />
<LinearLayout
android:layout_width="150dp"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:id="@+id/negativeButton"
android:layout_width="70dp"
android:layout_height="match_parent"
android:gravity="center"
android:text="取消"
android:textColor="#333333"
android:clickable="true"
android:textSize="18dp" />
<View
android:layout_width="2dip"
android:layout_height="match_parent"
android:background="#FF909090" />
<TextView
android:id="@+id/positiveButton"
android:layout_width="70dp"
android:layout_height="match_parent"
android:gravity="center"
android:text="确定"
android:clickable="true"
android:textColor="#333333"
android:textSize="18dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
这里为了让现实框变成圆角的,在linearlayout空间上加了一个background,文件名是window_bg,具体的圆角实现如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 顶部带圆角 白色背景 灰色边框 长方体 -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#FFFFFF" />
<corners android:topLeftRadius="10dp" android:topRightRadius="10dp"
android:bottomRightRadius="10dp" android:bottomLeftRadius="10dp" />
<stroke android:width="1dp" android:color="#ffa8abad" />
</shape>
</item>
<item android:top="1dp" android:left="1dp" android:right="1dp" android:bottom="1dp">
<shape>
<solid android:color="#FFFFFF" />
<corners android:topLeftRadius="10dp" android:topRightRadius="10dp"
android:bottomRightRadius="10dp" android:bottomLeftRadius="10dp" />
<stroke android:width="1dp" android:color="#ffffffff" />
</shape>
</item>
</layer-list>
这样就完成了显示图的设计,第一步完成。
step 2: 重写Dialog类
这里用了继承,在继承了Dialog类之后,重写所有的方法,同时,在里面加入自己需要的控件处理,请看代码和注释:
package com.example.blyang.myapplication;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;
public class MyDialog extends Dialog {
public MyDialog(Context context) {
super(context);
}
public MyDialog(Context context, int theme) {
super(context, theme);
}
public static class Builder {
private Context context;
private String message; //展示的提示信息
private String positiveButtonText; //确定按钮
private String negativeButtonText; //取消按钮
private View contentView;
private OnClickListener positiveButtonClickListener; //确定响应监听
private OnClickListener negativeButtonClickListener; //取消响应监听
public Builder(Context context) {
this.context = context;
}
public Builder setMessage(String message) {
this.message = message;
return this;
}
/**
* Set the Dialog message from resource
*
* @param
* @return
*/
public Builder setMessage(int message) {
this.message = (String) context.getText(message);
return this;
}
/**
* Set the Dialog title from resource
*
* @param title
* @return
*/
public Builder setTitle(int title) {
return this;
}
/**
* Set the Dialog title from String
*
* @param title
* @return
*/
public Builder setTitle(String title) {
return this;
}
public Builder setContentView(View v) {
this.contentView = v;
return this;
}
/**
* 响应监听器
*/
public Builder setPositiveButton(int positiveButtonText,
OnClickListener listener) {
this.positiveButtonText = (String) context
.getText(positiveButtonText);
this.positiveButtonClickListener = listener;
return this;
}
public Builder setPositiveButton(String positiveButtonText,
OnClickListener listener) {
this.positiveButtonText = positiveButtonText;
this.positiveButtonClickListener = listener;
return this;
}
public Builder setNegativeButton(int negativeButtonText,
OnClickListener listener) {
this.negativeButtonText = (String) context
.getText(negativeButtonText);
this.negativeButtonClickListener = listener;
return this;
}
public Builder setNegativeButton(String negativeButtonText,
OnClickListener listener) {
this.negativeButtonText = negativeButtonText;
this.negativeButtonClickListener = listener;
return this;
}
/**
* 包含相应的layout文件
* @return
*/
public MyDialog create() {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// 实例化一个AlertDialog,并且设定这个Dialog的style
final MyDialog dialog = new MyDialog(context,R.style.Dialog);
View layout = inflater.inflate(R.layout.dialog, null);
dialog.addContentView(layout, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
/**
* 确定按钮的监听
* 如果在实例化这个dialog的时候,确定按钮不为空,这设置它的显示字符串
* 如果确定按钮的监听器不为空,则调用响应的控件,给这个控件的监听器赋值
* 相反,如果实例化的时候监听器为空,则让这个控件的visibility设置为GONE
*/
if (positiveButtonText != null) {
((TextView) layout.findViewById(R.id.positiveButton))
.setText(positiveButtonText);
if (positiveButtonClickListener != null) {
((TextView) layout.findViewById(R.id.positiveButton))
.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
positiveButtonClickListener.onClick(dialog,
DialogInterface.BUTTON_POSITIVE);
}
});
}
} else {
// if no confirm button just set the visibility to GONE
layout.findViewById(R.id.positiveButton).setVisibility(
View.GONE);
}
/**
* 取消按钮的监听
* 参考确认按钮的说明
*/
if (negativeButtonText != null) {
((TextView) layout.findViewById(R.id.negativeButton))
.setText(negativeButtonText);
if (negativeButtonClickListener != null) {
((TextView) layout.findViewById(R.id.negativeButton))
.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
negativeButtonClickListener.onClick(dialog,
DialogInterface.BUTTON_NEGATIVE);
}
});
}
} else {
// if no confirm button just set the visibility to GONE
layout.findViewById(R.id.negativeButton).setVisibility(
View.GONE);
}
/**
* 设置展示信息
*/
if (message != null) {
((TextView) layout.findViewById(R.id.message)).setText(message);
}
dialog.setContentView(layout);
//创建完成之后,返回这个dialog
return dialog;
}
}
}
到这里,自定义的过程就完成了。注意到,在create的实例化的时候,给了一个style,这个style是很有用的,它的内部代码如下:
<style name="Dialog" parent="android:style/Theme.Dialog">
<!-- 设置整个界面背景透明 -->
<item name="android:background">#00000000</item>
<!-- 不允许调用的时候出现模糊,也就是不允许主界面有阴影效果,这个要大家可以试一试设成true和false的区别 -->
<item name="android:backgroundDimEnabled">false</item>
<!--窗体无标题 -->
<item name="android:windowNoTitle">true</item>
<!-- 窗体背景透明 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 悬浮-->
<item name="android:windowIsFloating">true</item>
</style>
下面就是这个重写的类的调用了。
step 3: 重写的类的调用
调用的时候和一般类的调用方法一致,首先要创建并实例化,再添加需要的处理,请看代码和注释:
MyDialog.Builder builder = new MyDialog.Builder(MainActivity.this);
builder.setMessage("提示框");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//设置具体的确认操作事件
}
});
builder.setNegativeButton("取消" , new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//设置具体的取消操作事件
}
});
builder.create().show();
到这里就完成了整个自定义和调用的过程。
附上代码链接:https://github.com/BLYang7/MyDialog.git
或者在CDSDN下载:http://download.youkuaiyun.com/detail/sinat_22013331/9464923