先看下AlertDialog,这个比较简单,都是android系统自定义的,布局文件就一个按钮,我就不贴代码了;
package com.example.builder;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button bt_click;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_click = (Button) findViewById(R.id.bt_click);
MyOnClick moc = new MyOnClick();
bt_click.setOnClickListener(moc);
}
private class MyOnClick implements OnClickListener {
@Override
public void onClick(View v) {
// 首先创造一个创建者出来,而不是直接new dialaog,
AlertDialog.Builder builder = new AlertDialog.Builder(
MainActivity.this);
// 每个set#()方法都返回当前Builder对象
builder.setMessage("过年好")
.setIcon(R.drawable.ic_launcher)
.setTitle("年")
.setPositiveButton("过年好",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
Toast.makeText(MainActivity.this, "过年好",
3000).show();
}
})
.setNegativeButton("不好",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
Toast.makeText(MainActivity.this, "不好",
3000).show();
}
})
.setNeutralButton("不知道",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
Toast.makeText(MainActivity.this, "不知道",
3000).show();
}
});
// 使用builder创建对话框
AlertDialog alertDdialog = builder.create();
// 显示对话框
alertDdialog.show();
}
}
}
建造者模式有一个优点,就是你想要什么样的对话框不需要自己去创建,告诉建造者就可以了,建造者会按照你的要求创建,如本例你完全可以告诉创建者你只要两个按钮而不要三个按钮,建造者也会按照你的要求创建对话框。
下面我们分析下系统的AlertDialog。
builder:建造者
AlertController:制造产品的机器,可以定制很多的产品,不同的设置,机器建造的产品也不同
AlertParams:制造产品的机器的参数,不同的参数,通过机器建造出的产品也不同,拥有可供选择的多个参数,如,title,message,button等。
客户告诉建造者自己想要的产品,建造者根据根据相应的要求设置相应的参数,创建出客户想要的产品,至于客户,他们根本不需要关心建造者是如何建造的。
public Builder setTitle(CharSequence title) {
P.mTitle = title;
return this;
这里setTitle实际上是为p复制,p就是机器的参数
public static class Builder {
private final AlertController.AlertParams P;
private int mTheme;
再看看builder.create()的方法,
public AlertDialog create() {
final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false);
各种参数设置完毕后,建造者就开始create产品了,我们再看下该构造方法的源码
源码分析完了,下面我们自己写一个自己的dialog
main_xml文件只有一个按钮我就不贴上来了;
看MainActivity代码
package com.example.builder;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button bt_click;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_click = (Button) findViewById(R.id.bt_click);
MyOnClick moc = new MyOnClick();
bt_click.setOnClickListener(moc);
}
private class MyOnClick implements OnClickListener {
@Override
public void onClick(View v) {
MyDialog.Builder builder=new MyDialog.Builder(MainActivity.this);
builder.setTitle("过年了");
builder.setMessage("你喜欢过年吗?");
builder.setOnConfirmListener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "喜欢", 3000).show();
}
});
builder.setOnOtherOneListener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "关你屁事", 3000).show();
}
});
MyDialog dialog =builder.create();
dialog.show();
}
}
}
MyDialog的源码
package com.example.builder;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MyDialog extends Dialog {
public MyDialog(Context context, boolean cancelable,
OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
}
public MyDialog(Context context, int theme) {
super(context, theme);
}
public MyDialog(Context context) {
super(context);
}
// 定义一台机器
public static class MyController {
// 机器的功能配置,机器的属性
public MyParams params;
public static class MyParams {
public Context context;
// 标题
public String title;
// 信息
public String message;
// 按钮监听,注意不是按钮,按钮由布局文件my_dialog确定
public DialogInterface.OnClickListener onConfirmListener;
public DialogInterface.OnClickListener onCancelListener;
public DialogInterface.OnClickListener onOtherOneListener;
public DialogInterface.OnClickListener onOtherTwoListener;
}
}
// 建造者
public static class Builder {
// 机器,不使用系统架构
public Context context;
public final MyController.MyParams params;// 在构造方法中赋值
public Builder(Context context) {
params = new MyController.MyParams();
params.context = context;
}
public Builder setTitle(String title) {
params.title = title;
return this;// 返回当前的builder对象
}
public Builder setMessage(String message) {
params.message = message;
return this;// 返回当前的builder对象
}
public Builder setOnCancelListener(
DialogInterface.OnClickListener OnCancelListener) {
params.onCancelListener = OnCancelListener;
return this;
}
public Builder setOnConfirmListener(
DialogInterface.OnClickListener onConfirmListener) {
params.onConfirmListener = onConfirmListener;
return this;
}
public Builder setOnOtherOneListener(
DialogInterface.OnClickListener onOtherOneListener) {
params.onOtherOneListener = onOtherOneListener;
return this;
}
public Builder setOnOtherTwoListener(
DialogInterface.OnClickListener onOtherTwoListener) {
params.onOtherTwoListener = onOtherTwoListener;
return this;
}
public MyDialog create() {
final MyDialog dialog = new MyDialog(params.context);
// 在这里加载布局,确定dialog布局,系统是在new机器的时候加载布局的
View view = LayoutInflater.from(params.context).inflate(
R.layout.my_dialog, null);
//消除对话框中那条可恶的横线及其以上的部分
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
//将布局放到dialog上
dialog.setContentView(view);
if (!TextUtils.isEmpty(params.title)) {// Returns true if the string
// is null or 0-length.
TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
tv_title.setText(params.title);
}
if (!TextUtils.isEmpty(params.message)) {// Returns true if the
// string is null or
// 0-length.
TextView tv_message = (TextView) view
.findViewById(R.id.tv_message);
tv_message.setText(params.message);
}
Button bt_confirm = (Button) view.findViewById(R.id.bt_confirm);
if (params.onConfirmListener != null) {// 表示用户设置了监听
bt_confirm.setVisibility(View.VISIBLE);
// 为按钮设置监听
bt_confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// dialog要求是常量,dialog: The dialog that received the
// click.
params.onConfirmListener.onClick(dialog, 0);
}
});
} else {
bt_confirm.setVisibility(View.GONE);//
}
Button bt_cancel = (Button) view.findViewById(R.id.bt_cancel);
if (params.onCancelListener != null) {// 表示用户设置了监听
bt_cancel.setVisibility(View.VISIBLE);
// 为按钮设置监听
bt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// dialog要求是常量,dialog: The dialog that received the
// click.
params.onCancelListener.onClick(dialog, 0);
}
});
} else {
bt_cancel.setVisibility(View.GONE);//
}
Button bt_other_one = (Button) view.findViewById(R.id.bt_other_one);
if (params.onOtherOneListener != null) {// 表示用户设置了监听
bt_other_one.setVisibility(View.VISIBLE);
// 为按钮设置监听
bt_other_one.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// dialog要求是常量,dialog: The dialog that received the
// click.
params.onOtherOneListener.onClick(dialog, 0);
}
});
} else {
bt_other_one.setVisibility(View.GONE);//
}
Button bt_other_two = (Button) view.findViewById(R.id.bt_other_two);
if (params.onOtherTwoListener != null) {// 表示用户设置了监听
bt_other_two.setVisibility(View.VISIBLE);
// 为按钮设置监听
bt_other_two.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// dialog要求是常量,dialog: The dialog that received the
// click.
params.onOtherTwoListener.onClick(dialog, 0);
}
});
} else {
bt_other_two.setVisibility(View.GONE);//
}
return dialog;
}
}
}
my_dialog.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:orientation="vertical" >
<!-- 可以随心所欲的设置样式 -->
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你想穿越吗?" />
<TextView
android:id="@+id/tv_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你敢穿越到清朝末年吗? " />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/bt_confirm"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="3dp"
android:text="确定"
android:textColor="@android:color/holo_blue_bright" />
<Button
android:id="@+id/bt_cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="3dp"
android:text="取消"
android:textColor="@android:color/holo_blue_bright" />
<Button
android:id="@+id/bt_other_one"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="3dp"
android:text="其他一"
android:textColor="@android:color/holo_blue_bright" />
<Button
android:id="@+id/bt_other_two"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="3dp"
android:text="其他二"
android:textColor="@android:color/holo_blue_bright" />
</LinearLayout>
</LinearLayout>
看下这张效果图
但是大家有没有发现那个横线很恶心,哎,我想了好久才找到消除他的方法,在代码里面了大家看看吧。
如果想点击弹出的对话框按钮后消失,可以做如下修改,加入dismiss()方法