在介绍自定义的对话框之前,我们先来介绍一下对话框的使用:常用对话框有四种,普通对话框、单选对话框、多选对话框、进度条对话框
下面举个例子假设有四个按钮,每个按钮对应一种对话框
普通对话框
//1、点击按钮弹出普通对话框
public void click1(View v){
//通过builder构造器来构造
AlertDialog.Builder builder=new Builder(this);
builder.setTitle("警告!");
builder.setMessage("世界最遥远的距离就是没有网络");
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("点击了确定按钮");
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("点击了取消按钮");
}
});
builder.show();
}
单选对话框
//2、点击按钮弹出单选对话框
public void click2(View v){
//通过builder构造器gouzao
AlertDialog.Builder builder =new Builder(this);
builder.setTitle("选择你喜欢的水果");
final String items[]={"香蕉","西瓜","黄瓜","哈密瓜","苹果"};
//-1代表默认没有条目被选中
builder.setSingleChoiceItems(items, -1, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//把选择到的条目取出来
String item=items[which];
Toast.makeText(getApplicationContext(), item, 1).show();
//关闭对话框
dialog.dismiss();
}
});
//显示对话框
builder.show();
}
多选对话框
//多选对话框
public void click3(View v){
//通过构造器构造
AlertDialog.Builder builder=new Builder(this);
builder.setTitle("请选择你喜欢的课程");
final String items[]={"android","C","C++","C#","IOs","java","html"};
//用来判断条目是否被选中
final boolean []checkedItems={true,false,true,false,false,false,false};
builder.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() {
@Override
//条目的点击事件
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
}
});
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
StringBuffer sb=new StringBuffer();
for(int i=0;i<checkedItems.length;i++){
//判断一下选中的
if(checkedItems[i]){
String fruit=items[i];
sb.append(fruit+" ");
}
}
Toast.makeText(getApplicationContext(), sb, 1).show();
dialog.dismiss();
}
});
builder.show();
}
进度条对话框
//进度条对话框
public void click4(View v){
//通过构造器来构造
final ProgressDialog dialog=new ProgressDialog(this);
dialog.setTitle("正在玩命加载中。。。");
//设置一下进度条的样式
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//最后一步一定要show()出来
dialog.show();
//创建一个子线程
new Thread(){
public void run(){
//设置进度条的最大值
dialog.setMax(100);
//设置当前进度
for(int i=0;i<=100;i++){
dialog.setProgress(i);
//睡眠一下
SystemClock.sleep(50);
}
dialog.show();
dialog.dismiss();
}}.start();
}
注意:与对话框有关的控件都可以在子线程中更新UI,最后要对话框显示都要调用show()方法
好了,现在来介绍介绍一下自定义的对话框
实现自定义对话框:
高低版本默认的背景色和字体颜色不一样、使高低版本保持一致的样式需设置其背景色、文本字体色
/**
* 享元模式,抽取多次使用的局部变量定义为全局变量
*/
private AlertDialog dialog;
private AlertDialog.Builder builder;
private View view;
private EditText et_password;
private Button btn_cancel;
private Button btn_ok;
/**
* 弹出登录界面对话框
*/
private void showEnterDialog() {
//密码存在时弹出
builder=new Builder(MainActivity.this);
view=View.inflate(MainActivity.this, R.layout.show_input_dialog, null);
builder.setView(view);
final EditText et_password_set = (EditText) view.findViewById(R.id.et_passeord);
btn_cancel = (Button) view.findViewById(R.id.btn_cancel);
btn_ok = (Button) view.findViewById(R.id.btn_ok);
btn_ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//获取密码的数值
String enterpassword=et_password_set.getText().toString().trim();
String sav_password=sp.getString("password", null);
if("enterpassword".equals(sav_password)){
ToastUtils.show(MainActivity.this, "密码正确,准备进入手机防盗界面!",0);
boolean finishsetup=sp.getBoolean("finishsetup", false);
if(finishsetup){
ToastUtils.show(MainActivity.this, "已经进行过手机防盗设置!",0);
//已经完成手机设置
IntentUtils.startActivityInfo(MainActivity.this, PhoneFangDaoActivity.class);
}else{
//没有完成手机设置
IntentUtils.startActivityInfo(MainActivity.this, Setup1Activity.class);
}
dialog.dismiss();
}else
{
ToastUtils.show(MainActivity.this, "密码错误,请重新输入密码!");
}
}
});
btn_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog=builder.show();
}
/**
* 弹出设置对话框
*/
public void showSetupDialog() {
builder = new Builder(MainActivity.this);
//加载一个布局
view = View.inflate(MainActivity.this, R.layout.show_setup_dialog, null);
builder.setView(view);
et_password = (EditText) view.findViewById(R.id.et_set_passeord);
final EditText et_password_config=(EditText) view.findViewById(R.id.et_passeord_config);
btn_cancel = (Button) view.findViewById(R.id.btn_cancel);
btn_ok = (Button) view.findViewById(R.id.btn_ok);
//对话框的确定事件
btn_ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//获取密码的数值
String password=et_password.getText().toString().trim();
String passwordConfig=et_password_config.getText().toString().trim();
if(TextUtils.isEmpty(password)||TextUtils.isEmpty(passwordConfig)){
ToastUtils.show(MainActivity.this, "密码不能为空");
}
if(!password.equals(passwordConfig)){
ToastUtils.show(MainActivity.this, "两次输入密码不一致!");
}
if(password.equals(passwordConfig)){
Editor edit=sp.edit();
//把加密后的密码存起来
edit.putString("password", "password");
edit.commit();
dialog.dismiss();
//进入登录界面
showEnterDialog();
}
}
});
btn_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog=builder.show();
}
自定义的布局 :
设置界面布局 show_input_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#BFFF01"
android:text="设置密码"
android:textSize="30dp"
android:gravity="center"/>
<EditText
android:gravity="center_horizontal"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:id="@+id/et_set_passeord"
android:hint="请输入密码"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:inputType="textPassword"/>
<EditText
android:gravity="center_horizontal"
android:layout_width="300dp"
android:id="@+id/et_passeord_config"
android:layout_height="wrap_content"
android:hint="请确定密码"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:inputType="textPassword"/>
<LinearLayout
android:layout_width="300dp"
android:orientation="horizontal"
android:layout_height="wrap_content">
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:background="@drawable/btn_background"
android:text="取消"
android:id="@+id/btn_cancel"
android:layout_marginRight="5dp"
android:layout_height="wrap_content"/>
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:id="@+id/btn_ok"
android:layout_marginLeft="5dp"
android:background="@drawable/btn_background"
android:text="确定"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
登录界面布局show_input_dialog
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#BFFF01"
android:text="登录界面"
android:textSize="30dp"
android:gravity="center"/>
<EditText
android:id="@+id/et_passeord"
android:gravity="center_horizontal"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:hint="请输入密码"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:inputType="textPassword"/>
<LinearLayout
android:layout_width="300dp"
android:orientation="horizontal"
android:layout_height="wrap_content">
<Button
android:layout_width="0dp"
android:id="@+id/btn_cancel"
android:layout_weight="1"
android:background="@drawable/btn_background"
android:text="取消"
android:layout_marginRight="5dp"
android:layout_height="wrap_content"/>
<Button
android:layout_width="0dp"
android:id="@+id/btn_ok"
android:layout_weight="1"
android:layout_marginLeft="5dp"
android:background="@drawable/btn_background"
android:text="登录"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
看到这里又会问这又是怎么定义
android:background="@drawable/btn_background"这句引用的是资源文件
这就是所谓的状态选择器:
**
就是在res目录下建立一个drawable文件中定义一个xml文件,设置属性background时引用这个xml文件就行。
//背景颜色选择<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/holo_blue_light" android:state_pressed="true">
<item android:drawable="@android:color/holo_blue_light" android:state_focused="true">
<item android:drawable="@android:color/holo_green_dark" >
</item></item></item>
</selector> **
网友评论