Dialog 对话框

ps:默认alertdialog的宽为屏幕的8/9, 高为屏幕的1/7!!

Dialog 常用方法:(格式:dialog.以下方法)

setProgressStyle:设置进度条风格,风格为圆形,旋转的。
setTitlt:设置标题
setMessage:设置提示信息;
setIcon:设置标题图标;
setIndeterminate:设置Dialog 的进度条是否不明确;这个属性对于ProgressDailog默认的转轮模式没有实际意义,默认下设置为true,它仅仅对带有ProgressBar的Dialog有作用。修改这个属性为false后可以实时更新进度条的进度。
setCancelable:设置Dialog 是否可以按返回键取消,屏蔽其它控件交互能力,除dialog以外的屏幕都不可点击;
cancelListner:当前Dialog强制取消之后将会被执行,通常用来清理未完成的任务。
setButton:设置ProgressDialog 的一个Button(需要监听Button事件);
show:显示Dialog。
cancel:删dialog
.setOnCancelListener(new Dial...):当删除dialog后执行该方法
dismiss: 删除progressdialog 作用和cancel相同
setOnDismissListener(new Dialo....):当删除dialog后执行该方法
setMax(int)、getMax:设置最大进度条的值
setProgress(int)、getProgress:更新进度条,当然一般都需要Handler的结合来更新进度条
incrementProgressBy(int)增加进度条
setProgressDrawable:设置progress发生变化时的进度指示条的背景图

ps:AlertDialog.Builder没有setOnShowListener方法(对象名称为aertDialog),但想要该方法时,可以这样,
再创建dialog把alertDialog赋值给dialog:
Dialog dialog=aertDialog.create();
dialog.setOnShowListener(new DialogInterface.OnShowListener() {.....
然后在弹出dialog.show();即可。

几种类型的dialog的使用:

第一种:普通三个选项的dialog(最多可写三个按钮,也可写一个)
先上图
在这里插入图片描述

代码如下:

    //====弹窗
    //1.创建对象
    AlertDialog.Builder alertDialog=new AlertDialog.Builder(SafetyActivity.this);

    //2.设置窗体样式
    alertDialog.setIcon(R.drawable.ic_rb_user_red);//标题图标
    alertDialog.setTitle("三个选项的dialog");//标题文字
    alertDialog.setMessage("提示:爱或恨");//提示信息

    //alertDialog.setCancelable(false);//屏蔽其它控件交互能力,除dialog以外的屏幕都不可点击

    //3.设置三个按钮的事件
    //积极选择
    alertDialog.setPositiveButton("爱", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(SafetyActivity.this,"点击了爱",Toast.LENGTH_LONG).show();
        }
    });
    //消极选择
    alertDialog.setNegativeButton("恨", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(SafetyActivity.this,"点击了恨",Toast.LENGTH_LONG).show();
        }
    });
    //中立选择
    alertDialog.setNeutralButton("没感觉", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(SafetyActivity.this,"点击了没感觉",Toast.LENGTH_LONG).show();
        }
    });

    //4.显示dialog
    alertDialog.show();

第二种:列表dialog
在这里插入图片描述
.

    final String[] items={"我是1","我是2","我是3"};

    AlertDialog.Builder listDialog=new AlertDialog.Builder(SafetyActivity.this);

    listDialog.setIcon(R.drawable.ic_rb_user_red);
    listDialog.setTitle("列表dialog");

    listDialog.setItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {//点击某一列的事件
            Toast.makeText(SafetyActivity.this,"点击了"+items[which],Toast.LENGTH_LONG).show();;
        }
    });

    listDialog.show();

第三种:单选dialog(和列表dialog差不多,只是在列表前面多了一个选择的图标)
在这里插入图片描述

    int choice=0;
    private void setViewEvenListener() {
        tvTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final String[] items={"我是1","我是2","我是3"};

                AlertDialog.Builder singleChoiceDialog=new AlertDialog.Builder(SafetyActivity.this);

                singleChoiceDialog.setIcon(R.drawable.ic_rb_user_red);
                singleChoiceDialog.setTitle("单选dialog");

                //生成单选选项,并监听选项事件;ps:第二个参数为默认选中哪个列表(索引)
                singleChoiceDialog.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //Toast.makeText(SafetyActivity.this,"点击了"+items[which],Toast.LENGTH_LONG).show();
                        choice=which;
                    }
                });

                //设置确定按钮
                singleChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {//这里的which没意义,值为-1
                        Toast.makeText(SafetyActivity.this,"点击了"+items[choice],Toast.LENGTH_LONG).show();
                    }
                });

                singleChoiceDialog.show();
            }

        });
    }

第四种:多选dialog
在这里插入图片描述

    ArrayList<Integer> choice=new ArrayList<>();
    private void setViewEvenListener() {
        tvTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final String[] items={"我是1","我是2","我是3"};
                boolean initChoices[]={false,false,false};//设置全部选择为false
                choice.clear();

                AlertDialog.Builder multiChoiceDialog=new AlertDialog.Builder(SafetyActivity.this);

                multiChoiceDialog .setIcon(R.drawable.ic_rb_user_red);
                multiChoiceDialog .setTitle("多选dialog");

                multiChoiceDialog.setMultiChoiceItems(items, initChoices, new DialogInterface.OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                        if(isChecked){
                            choice.add(which);
                        }else{
                            choice.remove(which);
                        }
                    }
                });

                multiChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        int size = choice.size();
                        String str="";
                        for (int i=0;i<size;i++){
                            str+=items[choice.get(i)]+"、";
                        }
                        Toast.makeText(SafetyActivity.this,"选中了"+str,Toast.LENGTH_LONG).show();
                    }
                });

                multiChoiceDialog.show();
            }
        });
    }

第五种:等待dialog
在这里插入图片描述

    final int max = 3;
    final ProgressDialog progressDialog = new ProgressDialog(SafetyActivity.this);
    progressDialog.setTitle("我是个等待的Dialog");
    progressDialog.setMessage("等待中");
    progressDialog.setCancelable(false);
    progressDialog.show();

    //新建线程执行关闭dialog
    new Thread(new Runnable() {
        @Override
        public void run() {
            int p=0;
            while (p<max){
                try {
                    Thread.sleep(1000);
                    p++;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            progressDialog.cancel();
        }
    }).start();

第六种:有进度条的dialog
在这里插入图片描述

    final int max = 30;
    final ProgressDialog progressDialog = new ProgressDialog(SafetyActivity.this);
    progressDialog.setTitle("我是个有进度条的Dialog");
    progressDialog.setMessage("等待中");
    progressDialog.setIndeterminate(false);
    progressDialog.setCancelable(false);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//进度条样式,参数写2效果相同
    progressDialog.setMax(max);//设置最大的进度条
    progressDialog.show();

    //新建线程执行关闭dialog
    new Thread(new Runnable() {
        @Override
        public void run() {
            int p=0;
            while (p<max){
                try {
                    Thread.sleep(100);
                    p++;
                    //更新进度条样式
                    progressDialog.setProgress(p);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            progressDialog.cancel();

        }
    }).start();

第七种:半自定义dialog
在这里插入图片描述

    AlertDialog.Builder alertDialog=new AlertDialog.Builder(SafetyActivity.this);

    alertDialog.setTitle("半自定义的dialog");

    alertDialog.setPositiveButton("哈哈哈", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(SafetyActivity.this,"点击了哈哈哈",Toast.LENGTH_LONG).show();
        }
    });

    //===当想自定义dialog的一些样式(宽高、弹出位置)
    //1.获取dialog
    AlertDialog dialog=alertDialog.create();
    //2.获取Dialogwindow对象
    Window window=dialog.getWindow();
    //3.获取到window管理器
    WindowManager manager=getWindowManager();
    //4.获取屏幕参数
    Display display=manager.getDefaultDisplay();
    //5.添加参数
    WindowManager.LayoutParams params=window.getAttributes();
    params.height= (int) (display.getHeight()*0.4);//设置dialog的高
    params.width=(int) (display.getWidth()*0.6);//设置dialog的宽
    /*设置全屏(setBackgroundDrawableResource:不设置背景颜色咋不能全屏呢。。。)
                    window.setBackgroundDrawableResource(R.color.colorWhite);
                    params.width = WindowManager.LayoutParams.MATCH_PARENT;
                    params.height = WindowManager.LayoutParams.MATCH_PARENT;
                    * */
    params.gravity= Gravity.TOP;//弹出位置
    params.alpha=0.8f;

    //6.window设置参数
    window.setAttributes(params);
    //显示
    dialog.show();

第八种:自定义dialog,添加布局文件:
在这里插入图片描述

    AlertDialog.Builder alertDialog=new AlertDialog.Builder(SafetyActivity.this);

    alertDialog.setTitle("自定义的dialog,加载布局文件");
    alertDialog.setView(R.layout.test);//添加布局文件

    alertDialog.setPositiveButton("哈哈哈", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(SafetyActivity.this,"点击了哈哈哈",Toast.LENGTH_LONG).show();
        }
    });
    alertDialog.show();

ps:若想只加载布局文件,把那句代码改为如下:(ps:如果不需要头部信息,可不设置setTitle)
AlertDialog.Builder alertDialog=new AlertDialog.Builder(SafetyActivity.this,R.style.DialogTheme);
R.style.DialogTheme:指的是:它可以设置dialog的样式

在values/styles.xml新建一个样式DialogTheme,代码如下:

    <!--parent="@android:style/Theme.Dialog":点击dialog之外的界面就会关闭dialog-->
    <style name="DialogTheme"  parent="@android:style/Theme.Dialog">
        <!-- 边框 -->
        <item name="android:windowFrame">@null</item>
        <!-- 是否浮现在activity之上 -->
        <item name="android:windowIsFloating">true</item>
        <!-- 半透明 -->
        <item name="android:windowIsTranslucent">true</item>
        <!-- 无标题 -->
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <!-- 背景透明 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!-- 模糊 -->
        <item name="android:backgroundDimEnabled">true</item>
        <!-- 遮罩层透明度 -->
        <item name="android:backgroundDimAmount">0.5</item>
    </style>

第九种:完全自定义dialog
步骤一:先写一个需求需要的布局文件(例如下:名称为:test)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorPrimary"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/colorWhite"
        android:text="dialog测试,这青色背景是布局文件"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/colorWhite"
        android:text="dialog测试,这青色背景是布局文件"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/colorWhite"
        android:text="dialog测试,这青色背景是布局文件"/>

</LinearLayout>

步骤二:写一个类继承dialog

public class TestDialog extends Dialog {
    
    //ps:!!!因为继承dialog,所以,在该类的方法里写dialog的方法即可(例:dismiss()),不用dialog.dismiss();
    
    public TestDialog(@NonNull Context context) {
        //如果要设置dialog占满宽或高,super里一定要添加R.style.DialogTheme,
        //否则params.width或params.height设置占满是没有效果的
        super(context,R.style.DialogTheme);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //设置布test局
        setContentView(R.layout.test);
        
        //=======设置关于dialog的样式,这样式也可以在创建TestDialog对象时那里写
        Window window=getWindow();//也可这样写:dialog.getWindow();
          
        //dialog显示的位置
        window.setGravity(Gravity.BOTTOM);
        
        //dialog的大小
        //window.getDecorView().setPadding(50,0,50,50);
        
        //dialog的动画(R.style.dialog_menu_animStyle:自定义的动画)
        window.setWindowAnimations(R.style.dialog_menu_animStyle);

        //设置参数
        WindowManager.LayoutParams params=window.getAttributes();
        params.width=WindowManager.LayoutParams.MATCH_PARENT;
        params.height=WindowManager.LayoutParams.WRAP_CONTENT;
    }
}

步骤三:在需要弹出该dialog的地方,使用自定义的dialog

                //==使用dialog
                TestDialog testDialog=new TestDialog(SafetyActivity.this);
                testDialog.show();

第十种:日期:
在这里插入图片描述

      Calendar calendar=Calendar.getInstance();
	  //参1:当前上下文,参2日期改变监听,参3设置显示的年,参4设置显示的月(0-11代表1-12月),参5设置显示的日
      new DatePickerDialog(SafetyListActivity.this, new DatePickerDialog.OnDateSetListener() {
          @Override//参2为改变后的年,参3月,参4日
          public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
				//日期改变事件
               Toast.makeText(SafetyListActivity.this,String.valueOf(year)+String.valueOf(month+1)+String.valueOf(dayOfMonth),Toast.LENGTH_LONG).show();
          }
      }, calendar.get(Calendar.YEAR) ,calendar.get(Calendar.MONTH) , calendar.get(Calendar.DAY_OF_MONTH)).show();

自定义dialog弹出和退出的动画

步骤一:在anim层(anim层时res层下的,是专门放动画的文件夹,第一次需要创建该文件夹,具体创建百度)
新建dialog_in_anim.xml文件做弹出过程,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fromXDelta="0%p"
        android:toXDelta="0%"
        android:fromYDelta="100%p"
        android:toYDelta="0" />

</set>
步骤二:再新建一个退出过程的xml,名为dialog_out_anim
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fromXDelta="0"
        android:fromYDelta="0%p"
        android:toXDelta="0"
        android:toYDelta="100%p" />
</set>
步骤三:在values层的styles.xml添加显示过程和退出过程的样式(dialog_menu_animStyle:样式名称,
可根据需求起)
    <style name="dialog_menu_animStyle">
        <item name="android:windowEnterAnimation">@anim/dialog_in_anim</item>
        <item name="android:windowExitAnimation">@anim/dialog_out_anim</item>
    </style>
步骤四:使用dialog_menu_animStyle这个动画:例:在上面第九种dialog知识里有写
		Window window=getWindow();//也可这样写:dialog.getWindow();
		//dialog的动画(R.style.dialog_menu_animStyle:自定义的动画)
        window.setWindowAnimations(R.style.dialog_menu_animStyle);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值