android 之Dialog的多种Dialog对话框(以及反射在自定义对话框的运用)


实际效果:




实例代码:

一个"启动初始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();
    }


猜你喜欢

转载自blog.csdn.net/qq_37169103/article/details/80647916