您的位置:首页 > 移动开发 > Android开发

Android中自定义对话框

2014-07-01 23:25 204 查看
在安卓基础中,我学习到了定义一个对话框弹窗,用来确定和取消,选择一些内容,进度等等,项目中进一步学会了自己定义对话框,不用系统的。

首先是调用系统的对话框,

AlertDialog.Builder builder = new Builder(this);
builder.setTitle("我是对话框");
builder.setMessage("对话框显示的内容");
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(), "确定被点击了", 0).show();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//什么都不写默认实现就是关闭掉对话框
}
});
builder.setCancelable(false);
builder.create().show();
}


代码如上,首先new一个AlertDialog.builder对象,然后setTitle(),setMessage(),setPositionButton就是确定按钮啦,在4.X版本是右面的按钮,2.X是左面的按钮,这里传两个值,第一个是按钮显示的名字,第二个是一个监听器;同样的,还有setPositiveButton(),同样传入两个参数。

但这个的对话框一看就是系统的,我们上淘宝,点退出的时候,对话框是很漂亮的,这就需要自定义对话框。简单几步:

首先,要自己写对话框的布局文件XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dip"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical"
android:background="#ffffff"
>

<TextView
android:layout_width="300dip"
android:layout_height="50dip"
android:background="#66ff6600"
android:gravity="center"
android:text="请输入密码"
android:textColor="#000000"
android:textSize="22sp" />

<EditText
android:id="@+id/et_setup_pwd"
android:layout_width="280dip"
android:layout_height="wrap_content"
android:hint="请输入密码"
android:inputType="textPassword" />

<LinearLayout
android:layout_width="300dip"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal" >

<Button
android:id="@+id/ok"
android:layout_width="140dip"
android:layout_height="wrap_content"
android:text="确定" />

<Button
android:id="@+id/cancel"
android:layout_width="140dip"
android:layout_height="wrap_content"
android:text="取消" />
</LinearLayout>

</LinearLayout>
显示的事输入两次密码的界面;

然后在对应要调用这个的java文件中写相应的加载方法:

private Button ok;
private Button cancle;
private EditText et_setup_pw;
private EditText et_setup_confirm;
private AlertDialog dialog;

protected void showLostDialog() {
final String passwordFromSp = sp.getString("password", "");
if(TextUtils.isEmpty(passwordFromSp)) {
AlertDialog.Builder builder = new Builder(this);
View view = View.inflate(this, R.layout.dialog_setup_password, null);
ok = (Button) view.findViewById(R.id.ok);
cancle = (Button) view.findViewById(R.id.cancel);
et_setup_pw = (EditText) view.findViewById(R.id.et_setup_pwd);
et_setup_confirm = (EditText) view.findViewById(R.id.et_setup_confirm);
builder.setView(view);
dialog = builder.show();
ok.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
String password = et_setup_pw.getText().toString();
String repassword = et_setup_confirm.getText().toString();
if(TextUtils.isEmpty(password)||TextUtils.isEmpty(repassword)) {
Toast.makeText(HomeActivity.this,"输入的密码不能为空" , 0).show();
return;
} else if(!password.equals(repassword)) {
Toast.makeText(HomeActivity.this,"密码和确认密码不一致" , 0).show();
return;
}
Editor editor = sp.edit();
editor.putString("password", MD5Utils.md5Password(password));
editor.commit();
Toast.makeText(HomeActivity.this,"密码保存成功" , 0).show();
dialog.dismiss();
//进入第一个界面
Intent intent = new Intent(getApplicationContext(), LostFindActivity.class);
startActivity(intent);
}
});
cancle.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
dialog.dismiss();

}
});
} else {
AlertDialog.Builder builder = new Builder(this);
View view = View.inflate(this, R.layout.dialog_enter_password, null);
builder.setView(view);
dialog = builder.show();
ok = (Button) view.findViewById(R.id.ok);
cancle = (Button) view.findViewById(R.id.cancel);
et_setup_pw = (EditText) view.findViewById(R.id.et_setup_pwd);

ok.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
String password = et_setup_pw.getText().toString();
if(!MD5Utils.md5Password(password).equals(passwordFromSp)) {
Toast.makeText(HomeActivity.this,"密码不正确" , 0).show();
return;
} else {
//进入界面
Toast.makeText(HomeActivity.this,"密码正确" , 0).show();
dialog.dismiss();
Intent intent = new Intent(getApplicationContext(), LostFindActivity.class);
startActivity(intent);
return;
}
}
});
cancle.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
dialog.dismiss();

}
});
}

}
和以前不同的是这次不再setTitle一系列操作了,而是先用inflate()把这个文件变成view,然后builder.setView,加载进这个构造器内,然后show()出来就行,如果要修改组件里面的内容,可以先声明组件,然后初始化,然后对相应的按钮设置相应的点击事件。

一般来说,取消就是把这个对话框消除掉,builder.dismiss()不能用,但是builder.show()会返回一个AlertDialog对象,在类外生命这个对象,然后在show的时候获得这个对象,这个就在取消按钮监听器中调用这个dialog.dismiss()方法消除掉这个对话框。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: