Android中自定义对话框

来源:互联网 发布:软件开发监理细则 编辑:程序博客网 时间:2024/05/16 19:52

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


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

AlertDialog.Builder builder = new Builder(this);builder.setTitle("我是对话框");builder.setMessage("对话框显示的内容");builder.setPositiveButton("确定", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(getApplicationContext(), "确定被点击了", 0).show();}});builder.setNegativeButton("取消", new OnClickListener() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void onClick(View arg0) {dialog.dismiss();}});}}
和以前不同的是这次不再setTitle一系列操作了,而是先用inflate()把这个文件变成view,然后builder.setView,加载进这个构造器内,然后show()出来就行,如果要修改组件里面的内容,可以先声明组件,然后初始化,然后对相应的按钮设置相应的点击事件。

一般来说,取消就是把这个对话框消除掉,builder.dismiss()不能用,但是builder.show()会返回一个AlertDialog对象,在类外生命这个对象,然后在show的时候获得这个对象,这个就在取消按钮监听器中调用这个dialog.dismiss()方法消除掉这个对话框。


0 0