实际效果:
实例代码:
一个"启动初始Activity.xml"
一个弹出的Activity
业务逻辑代码:
package com.hsj.example.alertdialogdemo04;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.lang.reflect.Field;
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
private AlertDialog dialog;
/**
* 自定义对话框
* @param view
*/
public void customerDialog(View view){
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("登录提示");
builder.setCancelable(false);
View loginView=View.inflate(this,R.layout.login_view_02,null);
final EditText editText_userName= (EditText) loginView.findViewById(R.id.editText_userName);
final EditText editText_pwd= (EditText) loginView.findViewById(R.id.editText_pwd);
builder.setView(loginView);//设置对话框的自定义View布局
builder.setPositiveButton("登录", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String userName=editText_userName.getText().toString();
String pwd=editText_pwd.getText().toString();
if(TextUtils.isEmpty(userName)){
editText_userName.setError("用户名必须输入");
editText_userName.requestFocus();
closeDialog(dialog,false);
return;
}
editText_pwd.requestFocus();
if(TextUtils.isEmpty(pwd)){
editText_pwd.setError("密码必须输入!");
editText_pwd.requestFocus();
closeDialog(dialog,false);
return;
}
if("admin".equals(userName) && "123".equals(pwd)){
Toast.makeText(getApplicationContext(),userName+"登录成功",Toast.LENGTH_LONG).show();
closeDialog(dialog,true);
}else {
closeDialog(dialog,false);
Toast.makeText(getApplicationContext(),"用户名或者密码错误!",Toast.LENGTH_LONG).show();
}
}
});
builder.setNegativeButton("重置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
editText_userName.setText(null);
editText_pwd.setText("");
editText_userName.requestFocus();
}
});
dialog= builder.show();
}
/**
* 决定是否关闭对话框
* @param dialog 对话框对象
* @param isClosed 对话框是否显示 true:关闭 false:不关闭
*/
private void closeDialog(DialogInterface dialog, boolean isClosed) {
//1.得到当前AlertDialog 的类模板对象
Class clz_alertDialog= dialog.getClass();
//2.得到当前类的父类的类模板
Class clz_dialog=clz_alertDialog.getSuperclass();
try {
Field mShowing_Filed= clz_dialog.getDeclaredField("mShowing");
//如果私有字段想在类外访问,则必须取消java 语法检查
mShowing_Filed.setAccessible(true);
mShowing_Filed.set(dialog,isClosed);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("==closeDialog(DialogInterface dialog="+dialog+", boolean isClosed="+isClosed+")==");
}
}
1.列表对话框的使用
2.单选列表对话框的使用
3.复选列表对话框的使用
123示例代码:
public class MainActivity_bak03 extends AppCompatActivity implements DialogInterface.OnClickListener{
private CharSequence[] fruits =new CharSequence[]{"香蕉","苹果","哈密瓜","西瓜","西红柿"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 列表对话框的使用
* @param view
*/
public void list(View view){
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("水果提示");
//builder.setMessage("看看有你喜欢的水果吗?");如果设置其他类型的对话框则这行代码必须不写,否则无效果
builder.setItems(fruits,this);//设置当前对话框为列表对话框
builder.create().show();
}
/**
* 当用户点击对应的条目时自动调用的方法
* @param dialog 对话框
* @param which 用户点击条目对应的索引值
*/
@Override
public void onClick(DialogInterface dialog, int which) {
CharSequence fruit=fruits[which];
Toast.makeText(this, "fruit="+fruit, Toast.LENGTH_SHORT).show();
System.out.println("===onClick(DialogInterface dialog="+dialog+", int which="+which+") ====");
//销毁对话框
dialog.dismiss();
}
/**
* 单选列表对话框的使用
* @param view
*/
public void radioList(View view){
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("水果提示");
builder.setSingleChoiceItems(fruits,//单选列表对话框的数据源
2,//哪些数据被选中,-1:表示不选中.0代表索引为0的数据项被选中,1:代表索引为1的数据项被选中,依次类推....
this);//设置单选列表对话框
builder.create().show();
}
/**
* 复选列表对话框的使用
* @param view
*/
public void multiList(View view){
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("水果提示");
//指定数据源中对应的数据项是否被选中,true 被选中,false 未被选中;这个数组中元素的个数一定要和数据源中数据元素的个数一一对应,
//否则,如果当前boolean 数组中元素的个数多于数据源中源的个数,没有问题,但如果小于数据源中源的个数则报索引越界异常:java.lang.ArrayIndexOutOfBoundsException: length=4; index=4
final boolean[] checkedList =new boolean[]{true,false,true,false,true};
builder.setMultiChoiceItems(fruits, checkedList, new DialogInterface.OnMultiChoiceClickListener() {
/**
* 当复选框列表项状态发生变化时自动调用的方法
* @param dialog 对话框对象
* @param which 选中条目的索引值
* @param isChecked true 当前项被选中 false 当前项取消选中
*/
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
System.out.println("==onClick(DialogInterface dialog="+dialog+", int which="+which+", boolean isChecked="+isChecked+")===");
System.out.println("checkedList="+ Arrays.toString(checkedList));
/*StringBuilder sb=new StringBuilder();
int len=fruits.length;
for(int i=0;i0){
//删除指定索引位的字符
sb.deleteCharAt(sb.length()-1);
}
Toast.makeText(getApplicationContext(),sb,Toast.LENGTH_LONG).show();*/
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
StringBuilder sb=new StringBuilder();
int len=fruits.length;
for(int i=0;i0){
//删除指定索引位的字符
sb.deleteCharAt(sb.length()-1);
}
Toast.makeText(getApplicationContext(),sb,Toast.LENGTH_LONG).show();
}
});
builder.show();
}