实际效果:
实例代码:
一个"启动初始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;i<len;i++){ if(checkedList[i]){ sb.append(fruits[i]).append(","); } } if(sb.length()>0){ //删除指定索引位的字符 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;i<len;i++){ if(checkedList[i]){ sb.append(fruits[i]).append(","); } } if(sb.length()>0){ //删除指定索引位的字符 sb.deleteCharAt(sb.length()-1); } Toast.makeText(getApplicationContext(),sb,Toast.LENGTH_LONG).show(); } }); builder.show(); }