Day11 Android - AlertDialog视窗

今天主要要来提AlertDialog(对话视窗),包含像是通知、基本的功能选择,AlertDialog的应用算是非常常见,我把它分成两个部分来提并实作,一种是一般的AlertDialog视窗、另一种是自定义View的AlertDialog视窗,首先先看到一般的对话视窗。

AlertDialog(一般)

https://ithelp.ithome.com.tw/upload/images/20210815/20139259znUTbXzeth.jpg
程序码的部分:

AlertDialog.Builder alert1 = new AlertDialog.Builder(MainActivity.this);//新建alert1对话盒在页面上
                alert1.setTitle("Title标题");//设置标题
                alert1.setMessage("Message内容");//设置内容
                alert1.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    //alertdialog 确定按钮
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //要做的事 没东西的话按了也会关闭
                    }
                });
                alert1.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    //alertdialog 取消按钮
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //要做的事
                    }
                });
                alert1.setNeutralButton("中立", new DialogInterface.OnClickListener() {
                //alertdialog 中立按钮
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //要做的事
                    }
                });
                alert1.show();//将设置的内容显示

首先第一步是新增对话盒,然後接下来常见的包含:设置标题(setTitle)、设置内容(setMessage)、另外可以设置的三颗按钮(确定positive、取消Negative、Neutral)以及.setCancelable(True False)方法,可以用来设置能不能使用返回键功能,另外如果要控制关不关闭视窗则需要另外宣告AlertDialog,大致上可以改成以下这个样子。

AlertDialog.Builder alert1 = new AlertDialog.Builder(MainActivity.this);//新建alert1对话盒在页面上
                AlertDialog SCN;
                alert1.setTitle("Title标题");//设置标题
                alert1.setMessage("Message内容");//设置内容
                alert1.setPositiveButton("确定",null);
                alert1.setNeutralButton("中立", null);
                alert1.setNegativeButton("取消", null);
                SCN=alert1.show();//将设置的内容显示
                SCN.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(MainActivity.this,"确定",Toast.LENGTH_SHORT).show();
                    }
                });
                SCN.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(MainActivity.this,"中立",Toast.LENGTH_SHORT).show();
                    }
                });
                SCN.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(MainActivity.this,"取消",Toast.LENGTH_SHORT).show();
                        SCN.dismiss();
                    }
                });

因为在AlertDialog.Builder内没有可以关闭对话视窗的方法,所以要透过宣告AlertDialog,将Builder指向AlertDialog来做使用dismiss的方法,当然也可以在里面新增EditText,但设超过1个就慢慢的会有些问题,所以就需要提刚刚所说的自定义view的AlertDialog了,然後可以在最外面设按钮来触发AlertDialog来观察结果。

AlertDialog(自定义view)

https://ithelp.ithome.com.tw/upload/images/20210815/2013925926tsot90RO.jpg
程序码的部分:

LayoutInflater layoutInflater = LayoutInflater.from(MainActivity.this);//取得activity提供的layoutinflater
                View alert = layoutInflater.inflate(R.layout.alert_page, null);//动态载入alertdialog页面生成view(可套用对应布局)
                AlertDialog.Builder scn = new AlertDialog.Builder(MainActivity.this);//新建scn对话盒在页面上(this)
                scn.setView(alert);//alertdialog使用view布局(R.layout.alert_page)
                AlertDialog SCN1;//因为AlertDialog.Builder内没有关闭视窗的方法,而AlertDialog有dismiss方法 则先宣告SCN1
                SCN1 = scn.show();//builder指向alertdialog
                EditText y=alert.findViewById(R.id.editTextNumberSigned);//用view绑元件
                EditText d=alert.findViewById(R.id.editTextNumberSigned2);
                Button b=alert.findViewById(R.id.button3);//view自定义的确认按钮
                Button b1=alert.findViewById(R.id.button4);//view自定义的取消按钮
                TextView Error = alert.findViewById(R.id.textView3);//如果未填毕会显示未填完资料的字串
                b.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String year=y.getText().toString();
                        String date=d.getText().toString();
                        if (!(("".equals(year.trim())) || ("".equals(date.trim())))) {  //资料未填毕不进入if
                            SCN1.dismiss();
                            AlertDialog.Builder scn2 = new AlertDialog.Builder(MainActivity.this);//建第二个视窗检视传入的结果
                            scn2.setTitle("Today");//使用一般的AlertDialog语法
                            scn2.setMessage("今年是" + year + "年\n"
                                    + "日期是" + date);
                            scn2.setPositiveButton("确定", null);//无监听者 按下去会关闭视窗不做任何事
                            scn2.setNegativeButton("取消", null);
                            scn2.show();
                        }
                        else
                            Error.setText("有资料尚未填入");
                    }
                });
                b1.setOnClickListener(new View.OnClickListener() {  //取消按钮监听
                    @Override
                    public void onClick(View v) {
                        SCN1.dismiss();//将此弹跳视窗关闭
                    }
                });

首先你可以先新增一个你想要设计在alertdialog上面的布局(layout),并透过宣告LayoutInflater取得这个activity的layoutInflater之後,使用layoutInflater.inflate的方法来动态载入那个布局生成view,最後透过setView(view)来套用刚刚生成的view,就会显示对应布局档的元件和布局了(整个视窗都可自定义),另外也可以透过view+findViewById来绑元件,也可以在里面再新增一个弹跳视窗等,我这边主要是写第一个弹跳视窗填入资料,第二个弹跳视窗显示资料,其他就是自己写的一些判断,接下来放上今天的成果。

成果(一般):

https://ithelp.ithome.com.tw/upload/images/20210815/20139259a0uyvZdYur.jpg

https://ithelp.ithome.com.tw/upload/images/20210815/20139259Y6YcjBY9zS.jpg

https://ithelp.ithome.com.tw/upload/images/20210815/20139259F7dhcZheTT.jpg

成果(自定义View):

https://ithelp.ithome.com.tw/upload/images/20210815/20139259eO9NA4oD1R.jpg

https://ithelp.ithome.com.tw/upload/images/20210815/20139259wFqHgTPd2i.jpg

https://ithelp.ithome.com.tw/upload/images/20210815/201392598qzOSMmqyU.jpg


<<:  从零开始学游戏设计:游戏音效

>>:  DAY11 Kotlin基础 条件语句

予焦啦!附录:诡异的时间中断(timer interrupt)搁置位元(pending bit)

在 3.0 那一篇,笔者介绍时间中断与简单的实作。也许也有读者注意到了不太顺畅的部分,那就是直接跳跃...

【第六天 - vim 备份泄漏】

Q1. vim 是什麽? 简单来说, vim 是一种纯文字编辑器,是从 vi 发展出的增强版,而 v...

Kotlin Android 第3天,从 0 到 ML - 基本语法和基本型态

前言: 简单介绍 kotlin的基本语法和基本型态。 大纲: 变数宣告 变数名称 : 变数型态 = ...

Day 7. Compare × G2 × Draft

接下来的 Draft 与 Slate 就是提供建立编辑器环境为主的 Framework Libra...

【Day 13】粗暴後门,Duck 不必 - Windows 简单後门

环境 Windows 10 1709 简介 後门 当入侵者成功取得某台机器的权限後,可能会希望之後仍...