Android中的对话框需要使用AlertDialog类来显示,主要用于显示提醒信息,不过这个对话框类可不仅仅能用来显示一些信息,我们可以在对话框中防止任何的控件,使其成为一个复杂且功能强大的用户接口。一个典型的例子就是使用AlertDialog做一个登录对话框。
通过查看AlertDialog类,我们可以发现,该类并没有public的构造方法,因此我们不能直接创建AlertDialog对象。
为了创建AlertDialog对象,我们需要使用Builder类,该类是AlertDialog的内部类。
首先,必须创建AlertDialog.Builder对象
然后,通过Builder的show方法显示对话框
或者通过Builder.create方法返回AlertDialog对象,再通过AlertDiaolg.show方法显示对话框。
显示这样的对话框的关键是如何显示两个按钮以及响应这两个按钮的单击事件。 通过AlertDialog.setPostitiveButton
和AlertDialog.setNegativeButton
可以为对话框添加两个按钮。
我们来看下这两个方法的定义
public Builder setPositiveButton(CharSequence text, final OnClickListener listener)
public Builder setPositiveButton(@StringRes int textId, final OnClickListener listener)
public Builder setNegativeButton(CharSequence text, final OnClickListener listener)
public Builder setNegativeButton(@StringRes int textId, final OnClickListener listener)
从上述的源码中可以看出,setPositiveButton和setNegativeButton方法各有两个重载形式,实现的功能是一致的,区别在于 text参数可以直接指定文本或者String变量,textId参数则需要指定一个字符串资源ID(需要在res\values目录中的xml文件中定义)。
一般来讲,setPositiveButton的按钮来添加 “确定”“Yes”等按钮,setNegativeButton方法来添加“取消”,”cancel”等。
OnClickListener为DialogInterface.OnClickListener中的类。响应用户的操作。
new AlertDialog.Builder(this)
.setIcon(R.drawable.flag_mark_blue)
.setTitle("是否下载文件?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 提示信息
AlertDialog dialog1 = new AlertDialog.Builder(DialogDemoListAct.this)
.setMessage("文件已下载成功")
.create();
dialog1.show();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 取消提示信息
new AlertDialog.Builder(DialogDemoListAct.this)
.setMessage("文件下载取消")
.create()
.show();
}
})
.show();
在使用AlertDialog类来创建对话框时需要注意以下几点:
用AlertDialog类创建的对话框最多可以添加3个按钮,除了上面添加两个方法,还可以使用setNeutralButton方法向对话框中添加第三个按钮
new AlertDialog.Builder(this)
.setIcon(R.drawable.flag_mark_violet)
.setTitle("是否覆盖文件?")
.setMessage("覆盖后源文件将丢失...吧啦吧啦")
.setPositiveButton("覆盖", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setNeutralButton("忽略", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
new AlertDialog.Builder(DialogDemoListAct.this)
.setMessage("忽略覆盖文件操作")
.create()
.show();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
注意事项:
通过AlertDialog.Builder类的setItems方法可以创建简单的列表对话框。 实际上,这种对话框相当于将ListView控件放在对话框上,然后在ListView中添加若干简单的文本()。
在这个实例中,选择后显示选中值,5S后自动关闭。
setItems方法定义如下
// items表示用于显示在列表中的字符串数组
public Builder setItems(CharSequence[] items, final OnClickListener listener)
// items标识字符串数据的资源ID
public Builder setItems(@ArrayRes int itemsId, final OnClickListener listener)
第二个参数 为 DialogInterface.OnClickListener类型。
new AlertDialog.Builder(this)
.setIcon(R.drawable.flag_mark_gray)
.setTitle("请选择省份")
.setItems(proviences, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 选择后的提示信息 记得调用show方法,否则不显示啦
final AlertDialog alertDialog = new AlertDialog.Builder(DialogDemoListAct.this)
.setMessage("选择了" + proviences[which])
.show();
// 设置定时器,5秒后,关闭AlertDialog
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() { // alertDialog.cancel(); 也可以
alertDialog.dismiss();
}
}, 5 * 1000);
}
})
.show();
在DialogInterface接口中有两个用于关闭对话框的方法:dismiss 和 cancel,这两个方法的功能完全相同,都是关闭对话框。
通过AlertDialog.Builder类的setSingleChoiceItems方法可以创建带有单选按钮的列表对话框。setSingleChoiceItems有4个重载形式:
// 从字符串数组中装载数据
public Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener)
// 从资源文件中装载数据
public Builder setSingleChoiceItems(@ArrayRes int itemsId, int checkedItem,
final OnClickListener listener)
// 从ListAdapter中装载数据
public Builder setSingleChoiceItems(ListAdapter adapter, int checkedItem, final OnClickListener listener)
// 从数据集中装载数据
public Builder setSingleChoiceItems(Cursor cursor, int checkedItem, String labelColumn,
final OnClickListener listener)
参数解释:
// 用于保存当前列表项索引
private int index;
final String[] proviences = {"北京", "上海", "广州", "深圳", "纽约", "华盛顿", "拉斯维加斯"};
new AlertDialog.Builder(this)
.setIcon(R.drawable.flag_mark_violet)
.setTitle("选择省份")
.setSingleChoiceItems(proviences, -1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 保存当前选中的列表项索引
index = which;
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 提示信息
new AlertDialog.Builder(DialogDemoListAct.this)
// 使用index
.setMessage(index + " " + proviences[index])
.show();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
new AlertDialog.Builder(DialogDemoListAct.this)
.setMessage("您没有选择")
.show();
}
})
.show();
通过AlertDialog.Builder.setMultiChoiceItems方法可以创建带复选框的列表对话框。
setMultiChoiceItems有3个重载方法
// 从资源文件中装载数据
public Builder setMultiChoiceItems(@ArrayRes int itemsId, boolean[] checkedItems,
final OnMultiChoiceClickListener listener)
// 从字符串数组中装载数据
public Builder setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems,
final OnMultiChoiceClickListener listener)
// 从数据集中装载数据
public Builder setMultiChoiceItems(Cursor cursor, String isCheckedColumn, String labelColumn,
final OnMultiChoiceClickListener listener)
参数解释:
// 多选对话框中的数据lv
private ListView lv;
AlertDialog ad = new AlertDialog.Builder(this)
.setIcon(R.drawable.tag_red)
.setTitle("选择省份")
.setMultiChoiceItems(proviences,
new boolean[]{false, false, false, false, false, false, false},
new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int count = lv.getCount();
String s = "您选择了:";
// 遍历
for (int i = 0; i < proviences.length; i++) {
if (lv.getCheckedItemPositions().get(i)) {
s += i + ":" + lv.getAdapter().getItem(i) + " ";
}
}
// 判断数量
if (lv.getCheckedItemPositions().size() > 0) {
new AlertDialog.Builder(DialogDemoListAct.this).setMessage(s).show();
} else {
new AlertDialog.Builder(DialogDemoListAct.this).setMessage("Nothing selected").show();
}
}
})
.setNegativeButton("取消", null)
.create();
// 获取lv
lv = ad.getListView();
// 显示AlertDialog ,show为异步方法,执行后,会继续执行下面的代码,在这里需要在最后调用
ad.show();
注意事项:
查看大拿的总结
进度对话框通过android.app.ProgressDialog类实现,该类是AlertDialog的之类,但与AlertDialog类不同,我们可以直接使用new关键字创建ProgressDialog对象。
进度条对话框除了要设置普通对话框必要的值外,还需要设置另外两个值:进度的最大值和当前的进度。
// 设置进度的最大值
public void setMax(int max)
// 设置当前的进度
public void setProgress(int value)
初始进度必须使用setProgress方法设置,而递增进度除了可以使用setProgress方法设置外,还可以使用以下方法
// 设置进度值的增量
public void incrementProgressBy(int diff)
区别在于 setProgress设置的绝对值,incrementProgressBy设置的是进度的增量。
与普通的对话框一样,进度对话框最多也只能添加3个按钮,而且可以设置进度对话框的风格:
// 创建ProgressDialog类
ProgressDialog pg = new ProgressDialog();
// 设置进度对话框为水平进度条风格
pg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
案例说明:
本案例演示了水平和原型进度对话框的实现方法,其中进度条包含两个按钮“暂停”和 “停止”,单击暂停后,进度对话框关闭,再此显示进度对话框时,进度条的起始位置从上次关闭对话框的位置开始(仅限与水平进度条)。 单击取消,关闭对话框,再此显示时,进度从0开始。
要实现进度随着时间的变化而不断递增,需要使用多线程及定时器来完成这个工作, 本例中使用Handler类来不断更新进度对话框的进度值。
// 水平进度条的最大值
private static final int MAX_PROGRESS = 100;
// 默认的初始值
private int progress = 0;
private void showProgressBarDialog(int style) {
final ProgressDialog progressDialog = new ProgressDialog(this);
// 设置提示的title的图标,默认是没有的
progressDialog.setIcon(R.drawable.flag_mark_red);
progressDialog.setTitle("数据处理中...");
progressDialog.setMessage("请稍后...");
// 设置进度对话框的风格 ,默认是圆形的
progressDialog.setProgressStyle(style);
// 设置是否可以通过点击Back键取消 默认true
progressDialog.setCancelable(false);
// 设置在点击Dialog外是否取消Dialog进度条 默认true
progressDialog.setCanceledOnTouchOutside(false);
// 设置最大值
progressDialog.setMax(MAX_PROGRESS);
// 设置暂停按钮
progressDialog.setButton(DialogInterface.BUTTON_POSITIVE, "暂停", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 通过删除消息代码的方式停止定时器
progressDialogHandler.removeMessages(PROGRESSDIALOG_FLAG);
}
});
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "停止", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
progressDialogHandler.removeMessages(PROGRESSDIALOG_FLAG);
progress = 0;
progressDialog.setProgress(progress);
}
});
// 展示
progressDialog.show();
progressDialogHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (progress >= MAX_PROGRESS) {
// 消失 并重置初始值
progressDialog.dismiss();
progress = 0;
} else {
progress++;
progressDialog.incrementProgressBy(1);
// 随机设置下一次递增进度 (50 +毫秒)
progressDialogHandler.sendEmptyMessageDelayed(1, 50 + new Random().nextInt(500));
}
}
};
// 设置进度初始值
progress = (progress > 0) ? progress : 0;
progressDialog.setProgress(progress);
// 发送消息
progressDialogHandler.sendEmptyMessage(PROGRESSDIALOG_FLAG);
}
注意事项:
我们可以直接使用布局文件或者代码创建视图对象,并将这些属兔对象添加到对话框中。
AlertDialog.Builder.setView方法可以将视图对象添加到当前的对话框中,使用下面的形式将一个视图对象添加到对话框中。
new AlertDialog.Builder(this)
.setIcon(R.drawable.xxx)
.setTitle("自定义对话框")
.setView(......)
.show();
private void showCustomViewDialog() {
// 第一种方式 将布局文件转换为view
LayoutInflater inflater = LayoutInflater.from(this);
View view = inflater.inflate(R.layout.activity_alertdialog_login, null);
// 第二种方式 因为R.layout.activity_login的根布局是LinearLayout
//LinearLayout view = (LinearLayout) getLayoutInflater().inflate(R.layout.activity_alertdialog_login, null);
new AlertDialog.Builder(this)
.setIcon(R.drawable.tag_red)
.setTitle("用户登录")
.setView(view)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 登录逻辑
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 取消逻辑
}
})
.show();
}
activity_alertdialog_login.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户名:"
android:textSize="20sp" />
<EditText
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密 码:"
android:textSize="20sp" />
<EditText
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:password="true" />
LinearLayout>
LinearLayout>
Activity类提供了创建对话框的快捷方式。 在Activity类中有一个onCreateDialog方法。定义如下
protected Dialog onCreateDialog(int id)
当调用Activity.showDialog方法时,系统会调用onCreateDialog方法来返回一个Dialog对象 (AlertDialog是Dialog的子类)。 showDialog方法和onCreateDialog方法一样,也有一个int类型的id参数。该参数值传入onCreateDialog方法。可以利用不同的id来建立多个对话框。
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import com.turing.base.R;
public class ActivityDialog extends Activity implements View.OnClickListener {
private final int DIALOG_DELETE_FILE = 1;
private final int DIALOG_SIMPLE_LIST = 2;
private final int DIALOG_SINGLE_CHOICE_LIST = 3;
private final int DIALOG_MULTI_CHOICE_LIST = 4;
private ListView lv = null;
private String[] provinces = new String[]
{"辽宁省", "山东省", "河北省", "福建省", "广东省", "黑龙江省"};
private ButtonOnClick buttonOnClick = new ButtonOnClick(1);
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnDeleteFile:
showDialog(DIALOG_DELETE_FILE);
break;
case R.id.btnSimpleList:
showDialog(DIALOG_SIMPLE_LIST);
break;
case R.id.btnSingleChoiceList:
showDialog(DIALOG_SINGLE_CHOICE_LIST);
break;
case R.id.btnMultiChoiceList:
showDialog(DIALOG_MULTI_CHOICE_LIST);
break;
case R.id.btnRemoveDialog:
removeDialog(DIALOG_DELETE_FILE);
removeDialog(DIALOG_SIMPLE_LIST);
removeDialog(DIALOG_SINGLE_CHOICE_LIST);
removeDialog(DIALOG_MULTI_CHOICE_LIST);
break;
}
}
@Override
protected Dialog onCreateDialog(int id) {
Log.d("dialog", String.valueOf(id));
switch (id) {
case DIALOG_DELETE_FILE:
return new AlertDialog.Builder(this).setIcon(
R.drawable.flag_mark_gray).setTitle("是否删除文件")
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
new AlertDialog.Builder(ActivityDialog.this)
.setMessage("文件已经被删除.")
.create().show();
}
}).setNegativeButton("取消",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
new AlertDialog.Builder(ActivityDialog.this)
.setMessage(
"您已经选择了取消按钮,该文件未被删除.")
.create().show();
}
}).create();
case DIALOG_SIMPLE_LIST:
return new AlertDialog.Builder(this).setTitle("选择省份").setItems(
provinces, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
final AlertDialog ad = new AlertDialog.Builder(
ActivityDialog.this).setMessage(
"您已经选择了: " + which + ":"
+ provinces[which]).show();
android.os.Handler hander = new android.os.Handler();
hander.postDelayed(new Runnable() {
@Override
public void run() {
ad.dismiss();
}
}, 5 * 1000);
}
}).create();
case DIALOG_SINGLE_CHOICE_LIST:
return new AlertDialog.Builder(this).setTitle("选择省份")
.setSingleChoiceItems(provinces, 1, buttonOnClick)
.setPositiveButton("确定", buttonOnClick)
.setNegativeButton("取消", buttonOnClick).create();
case DIALOG_MULTI_CHOICE_LIST:
AlertDialog ad = new AlertDialog.Builder(this).setIcon(
R.drawable.flag_mark_blue).setTitle("选择省份").setMultiChoiceItems(
provinces, new boolean[]
{false, true, false, true, false, false},
new DialogInterface.OnMultiChoiceClickListener() {
public void onClick(DialogInterface dialog,
int whichButton, boolean isChecked) {
}
}).setPositiveButton("确定",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
int count = lv.getCount();
String s = "您选择了:";
for (int i = 0; i < provinces.length; i++) {
if (lv.getCheckedItemPositions().get(i))
s += i + ":"
+ lv.getAdapter().getItem(i)
+ " ";
}
if (lv.getCheckedItemPositions().size() > 0) {
new AlertDialog.Builder(ActivityDialog.this)
.setMessage(s).show();
} else {
new AlertDialog.Builder(ActivityDialog.this)
.setMessage("您未选择任何省份").show();
}
}
}).setNegativeButton("取消", null).create();
lv = ad.getListView();
return ad;
}
return null;
}
private class ButtonOnClick implements DialogInterface.OnClickListener {
private int index;
public ButtonOnClick(int index) {
this.index = index;
}
@Override
public void onClick(DialogInterface dialog, int whichButton) {
if (whichButton >= 0) {
index = whichButton;
} else {
if (whichButton == DialogInterface.BUTTON_POSITIVE) {
new AlertDialog.Builder(ActivityDialog.this).setMessage(
"您已经选择了: " + index + ":" + provinces[index]).show();
} else if (whichButton == DialogInterface.BUTTON_NEGATIVE) {
new AlertDialog.Builder(ActivityDialog.this).setMessage("您什么都未选择.")
.show();
}
}
}
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity_dialog);
Button btnDeleteFile = (Button) findViewById(R.id.btnDeleteFile);
Button btnSimpleList = (Button) findViewById(R.id.btnSimpleList);
Button btnSingleChoiceList = (Button) findViewById(R.id.btnSingleChoiceList);
Button btnMultiChoiceList = (Button) findViewById(R.id.btnMultiChoiceList);
Button btnRemoveDialog = (Button) findViewById(R.id.btnRemoveDialog);
btnDeleteFile.setOnClickListener(this);
btnSimpleList.setOnClickListener(this);
btnSingleChoiceList.setOnClickListener(this);
btnMultiChoiceList.setOnClickListener(this);
btnRemoveDialog.setOnClickListener(this);
}
}
默认对话框的位置都是位于屏幕的中央,其实可以根据需要位于屏幕的上下左右甚至是任意位置,
要控制对话框的显示位置,需要获得对话框的Window对象,并通过Window对象的一些方法来控制对话框的显示位置。
case 12: // 改变对话框的显示位置
// changePostionOfDialog(Gravity.TOP);
// changePostionOfDialog(Gravity.BOTTOM);
// changePostionOfDialog(Gravity.LEFT);
// changePostionOfDialog(Gravity.RIGHT);
// 右上方
// changePostionOfDialog(Gravity.RIGHT | Gravity.TOP);
// 显示在任意位置
showAnyPostionOfDilaog();
break;
private void changePostionOfDialog(int postion) {
/**
AlertDialog alertDialog = new AlertDialog.Builder(this)
.setIcon(R.drawable.flag_mark_blue)
.setTitle("改变位置的AlertDiaolog")
.setMessage("我在" + postion)
.create();
alertDialog.getWindow().setGravity(postion);
alertDialog.show();
**/
ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setIcon(R.drawable.flag_mark_yellow);
progressDialog.setTitle("ProgressDialog改变位置");
progressDialog.setMessage("where am I ?");
progressDialog.getWindow().setGravity(postion);
progressDialog.show();
}
private void showAnyPostionOfDilaog() {
AlertDialog ad = new AlertDialog.Builder(this)
.setIcon(R.drawable.flag_mark_blue)
.setTitle("改变位置的AlertDiaolog")
.setMessage("我在自定义的任意位置")
.create();
Window window = ad.getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
// 设置水平偏移量
lp.x = -20;
// 设置垂直偏移量
lp.y = -120;
window.setAttributes(lp);
ad.show();
}
给TextView控件中插入图像的方法同样也适用。
AlertDialog alertDialog = new AlertDialog.Builder(this)
.setIcon(R.drawable.flag_mark_blue)
.setTitle("问候")
.setMessage(
Html.fromHtml("哈哈,你好.", new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Drawable drawable = getResources().getDrawable(
R.drawable.face);
drawable.setBounds(0, 0, 32, 32);
return drawable;
}
}, null))
.setPositiveButton(
Html.fromHtml("确定", new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Drawable drawable = getResources().getDrawable(
R.drawable.ok);
drawable.setBounds(0, 0, 20, 20);
return drawable;
}
}, null), null)
.setNegativeButton(
Html.fromHtml("取消", new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Drawable drawable = getResources().getDrawable(
R.drawable.cancel);
drawable.setBounds(0, 0, 20, 20);
return drawable;
}
}, null), null).create();
alertDialog.show();
通过WindowManager.LayoutParams.alpha可以设置对话框的透明度。
Alpha的取值范围为0.0f ~ 1.0f之间,f表示float类型的数字。 默认1.0f ,完全不透明。 0.0f表示全透明,此时就看不到对话框了。
0.7f
private void showTransparency_dialog(float v) {
// 创建对话框
AlertDialog ad = new AlertDialog.Builder(this)
.setTitle("改变对话框的透明度")
.setIcon(R.drawable.tag_red)
.setMessage("Alpha的取值范围 0~1 ,默认 1 ,我的透明度是" + v)
.setPositiveButton("确定",null)
.create();
// 设置透明度
Window window = ad.getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.alpha = v ;
window.setAttributes(lp);
// 展示对话框
ad.show();
}