版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章Dialog对话框和样式主题在编程实践中,除了需要使用上一章介绍的程序组件外,还经常需要使用对话框,也就是Dialog,例如,通过对话框要求用户确认某个操作,或者需要用户选择某个日期时间等,在这些情况下需要使用对话框。再者,像可以改变Android手机的整体外观主题类似,也可以改变一个应用程序的主题外观,例如,将应用程序的外观主题从Light色调改变为Dark色调。这就是应用程序的样式主题控制。本章对Android的常用对话框和应用程序的样式主题控制做一介绍。目录6.1使用AlertDialog对话框组件6.2DatePickerDialog/TimePickerDialog对话框6.3ProgressDialog等待对话框和进度条对话框6.4课后同步练习6.5样式主题6.1使用AlertDialog对话框组件AlertDialog对话框是Android常用的视图组件之一,使用AlertDialog,可以实现如下形式的对话框:提示消息对话框、列表对话框、单选对话框、多选对话框、输入对话框等多种形式。下面对AlertDialog对话框组件的使用进行介绍。6.1.1提示消息对话框使用AlertDialog组件可以实现提示消息对话框功能。提示消息对话框经常用于对重要消息的显示,例如,提示用户即将退出系统,或者即将删除某条信息等。使用提示消息对话框提请用户关注某一操作的结果。在对话框中可以显示“确认”按钮、“取消”按钮待用户确认。下面举一个例子说明如何使用AlertDialog实现提示消息对话框。新建名为ch0601的工程,修改主布局activity_main.xml文件为如下代码:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity">
<Buttonandroid:id="@+id/btn_info"android:layout_width="match_parent"android:layout_height="60dp"android:layout_margin="5dp"android:text="提示消息对话框"/>
</LinearLayout>修改MainActivity.java,使之监听对id为btn_info的按钮的点击,然后显示一个AlertDialog对话框。修改后的代码如下:packagecom.example.ch0601;
importandroid.app.AlertDialog;importandroid.content.DialogInterface;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.Toast;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
importcom.google.android.material.button.MaterialButtonToggleGroup;
publicclassMainActivityextendsAppCompatActivity{
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
Buttonbtn_info=findViewById(R.id.btn_info);btn_info.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){finalAlertDialog.BuildernormalDialog=newAlertDialog.Builder(MainActivity.this);normalDialog.setIcon(R.mipmap.png0011);normalDialog.setTitle("提示消息对话框");normalDialog.setMessage("可以点击其中一个按钮关闭对话框。");normalDialog.setPositiveButton("确定",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){Toast.makeText(MainActivity.this,"点击了确定按钮",Toast.LENGTH_LONG).show();}});normalDialog.setNegativeButton("取消",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){Toast.makeText(MainActivity.this,"点击了取消按钮",Toast.LENGTH_LONG).show();}});normalDialog.show();}});}}6.1.2列表对话框可以使用AlertDialog显示一个列表对话框。列表对话框,顾名思义,就是在对话框中显示一个列表。下面举例说明如何使用AlertDialog显示列表对话框。在ch0601工程的主布局文件activity_main.xml文件中增加一个新的按钮,新增按钮的代码如下:<Buttonandroid:id="@+id/btn_list"android:layout_width="match_parent"android:layout_height="60dp"android:layout_margin="5dp"android:text="列表对话框"/>然后,在MainActivity.java代码的onCreate()方法中新增如下代码:Buttonbtn_list=findViewById(R.id.btn_list);btn_list.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){finalString[]items={"读书学习","打球锻炼身体","去购书中心买书"};AlertDialog.BuilderlistDialog=newAlertDialog.Builder(MainActivity.this);listDialog.setTitle("列表对话框");listDialog.setItems(items,newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){Toast.makeText(MainActivity.this,"点击了:"+items[which],Toast.LENGTH_SHORT).show();}});listDialog.show();}});6.1.3单选对话框可以使用AlertDialog实现单选对话框。所谓单选对话框,就是从一组可选项选择一个选项。下面举例说明如何使用AlertDialog实现单选对话框。在ch0601工程的主布局文件activity_main.xml文件中增加一个新的按钮,新增按钮的代码如下:<Buttonandroid:id="@+id/btn_radio"android:layout_width="match_parent"android:layout_height="60dp"android:layout_margin="5dp"android:text="单选对话框"/>然后,在MainActivity.java代码的onCreate()方法中新增如下代码:Buttonbtn_radio=findViewById(R.id.btn_radio);btn_radio.setOnClickListener(newView.OnClickListener(){intchoice=0;@OverridepublicvoidonClick(Viewv){finalString[]items={"读书学习","打球锻炼身体","去购书中心买书"};AlertDialog.BuildersingleChoiceDialog=newAlertDialog.Builder(MainActivity.this);singleChoiceDialog.setTitle("单选对话框");//第二个参数是默认选项,此处设置为0singleChoiceDialog.setSingleChoiceItems(items,0,newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){choice=which;}});singleChoiceDialog.setPositiveButton("确定",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){if(choice!=-1){Toast.makeText(MainActivity.this,"你选择了:"+items[choice],Toast.LENGTH_SHORT).show();}}});singleChoiceDialog.show();}});6.1.4多选对话框可以使用AlertDialog实现多选对话框。所谓多选对话框,就是从一组可选项选择多个选项。下面举例说明如何使用AlertDialog实现多选对话框。在ch0601工程的主布局文件activity_main.xml文件中增加一个新的按钮,新增按钮的代码如下:<Buttonandroid:id="@+id/btn_multi"android:layout_width="match_parent"android:layout_height="60dp"android:layout_margin="5dp"android:text="多选对话框"/>然后,在MainActivity.java代码的onCreate()方法中新增如下代码:Buttonbtn_multi=findViewById(R.id.btn_multi);btn_multi.setOnClickListener(newView.OnClickListener(){finalArrayList<Integer>choices=newArrayList<>();@OverridepublicvoidonClick(Viewv){finalString[]items={"读书学习","打球锻炼身体","去购书中心买书"};//设置默认选中的选项,全为false默认均未选中finalbooleaninitChoiceSets[]={false,false,false};choices.clear();AlertDialog.BuildermultiChoiceDialog=newAlertDialog.Builder(MainActivity.this);multiChoiceDialog.setTitle("多选对话框");multiChoiceDialog.setMultiChoiceItems(items,initChoiceSets,newDialogInterface.OnMultiChoiceClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich,booleanisChecked){if(isChecked){choices.add(which);}else{choices.remove(which);}}});multiChoiceDialog.setPositiveButton("确定",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){intsize=choices.size();Stringstr="";for(inti=0;i<size;i++){str+=items[choices.get(i)]+"";}if(!str.isEmpty())Toast.makeText(MainActivity.this,"你选中了:"+str,Toast.LENGTH_SHORT).show();}});multiChoiceDialog.show();}});6.1.5输入对话框有时,需要提示用户输入某些信息,此时,可以使用输入对话框。使用AlertDialog可以实现输入对话框。在ch0601工程的主布局文件activity_main.xml文件中增加一个新的按钮,新增按钮的代码如下:<Buttonandroid:id="@+id/btn_input"android:layout_width="match_parent"android:layout_height="60dp"android:layout_margin="5dp"android:text="输入对话框"/>然后,在MainActivity.java代码的onCreate()方法中新增如下代码:Buttonbtn_input=findViewById(R.id.btn_input);btn_input.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){finalEditTexteditText=newEditText(MainActivity.this);AlertDialog.BuilderinputDialog=newAlertDialog.Builder(MainActivity.this);inputDialog.setTitle("输入对话框").setView(editText);inputDialog.setPositiveButton("确定",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){Toast.makeText(MainActivity.this,"输入:"+editText.getText().toString(),Toast.LENGTH_SHORT).show();}});inputDialog.show();}});6.2DatePickerDialog/TimePickerDialog对话框日期和时间选择是编程中经常会遇到的情况,Android为日期时间选择性输入提供了相应的组件:DatePickerDialog和TimePickerDialog。这两个组件的使用并不难,下面举例说明这两个组件的使用。这个例子要求录入会议信息:输入会议的主题,会议参与者,和会议的开始日期和时间。为此,新建名称为ch0602的工程,修改主布局文件activity_main.xml为如下所示的代码:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity">
<EditTextandroid:layout_width="match_parent"android:layout_height="60dp"android:hint="请输入会议主题"/>
<EditTextandroid:layout_width="match_parent"android:layout_height="60dp"android:hint="请输入会议参与者"/>
<EditTextandroid:id="@+id/date_select"android:layout_width="match_parent"android:layout_height="60dp"android:inputType="date"android:hint="请选择会议日期"/>
<EditTextandroid:id="@+id/time_select"android:layout_width="match_parent"android:layout_height="60dp"android:inputType="date"android:hint="请选择会议时间"/>
</LinearLayout>修改MainActivity.java:packagecom.example.ch0602;
importandroid.app.DatePickerDialog;importandroid.app.TimePickerDialog;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.DatePicker;importandroid.widget.EditText;importandroid.widget.TimePicker;importandroid.widget.Toast;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
importjava.util.Calendar;
publicclassMainActivityextendsAppCompatActivity{
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
EditTextedd=findViewById(R.id.date_select);edd.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Calendarc=Calendar.getInstance();DatePickerDialogdialog=newDatePickerDialog(MainActivity.this,newDatePickerDialog.OnDateSetListener(){@OverridepublicvoidonDateSet(DatePickerview,intyear,intmonthOfYear,intdayOfMonth){edd.setText(year+"-"+(monthOfYear+1)+"-"+dayOfMonth);}},c.get(Calendar.YEAR),c.get(Calendar.MONTH),c.get(Calendar.DAY_OF_MONTH));dialog.show();}});
EditTextedt=findViewById(R.id.time_select);edt.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Calendarc=Calendar.getInstance();TimePickerDialogdialog=newTimePickerDialog(MainActivity.this,newTimePickerDialog.OnTimeSetListener(){@OverridepublicvoidonTimeSet(TimePickerview,inthourOfDay,intminute){edt.setText(hourOfDay+":"+minute);}},c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),true);dialog.show();}});}}6.3ProgressDialog等待对话框和进度条对话框等待对话框,顾名思义,就是提示用户系统在运行一个需要较长时间的任务,提示用户等待,并且在等待期间,用户不能做其他操作。进度条对话框,就是高职某个任务的完成进展情况。AndroidSDK提供了ProgressDialog组件完成等待对话框和进度条对话框功能。下面举例说明等待对话框和进度条对话框和使用。这个例子在界面上显示两个按钮,点击按钮分别显示等待对话框和进度条对话框。弹出的对话框后,系统启动一个定时任务来模拟需要一定时间完成的任务,定时时间达到预定市场后,自动关闭对话框。为此,新建名为ch0603的工程,修改主界面布局activity_main.xml为如下代码:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity">
<Buttonandroid:id="@+id/btn_waiting"android:layout_width="match_parent"android:layout_height="60dp"android:text="打开等待对话框"/>
<Buttonandroid:id="@+id/btn_progress"android:layout_width="match_parent"android:layout_height="60dp"android:text="打开进度对话框"/>
</LinearLayout>MainActivity.java代码:packagecom.example.ch0603;
importandroid.app.ProgressDialog;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivity{
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});Buttonb1=findViewById(R.id.btn_waiting);b1.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){show_waiting();}});
Buttonb2=findViewById(R.id.btn_progress);b2.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){show_progress();}});}privatevoidshow_waiting(){ProgressDialogwaitingDialog=newProgressDialog(MainActivity.this);waitingDialog.setTitle("等待对话框");waitingDialog.setMessage("等待中...");waitingDialog.setIndeterminate(true);waitingDialog.setCancelable(true);waitingDialog.show();
newThread(newRunnable(){intcount=0;@Overridepublicvoidrun(){while(count<5){try{Thread.sleep(1000);count++;}catch(InterruptedExceptione){thrownewRuntimeException(e);}}waitingDialog.cancel();//关闭对话框}}).start();}privatevoidshow_progress(){finalintMAX_PROGRESS=100;finalProgressDialogprogressDialog=newProgressDialog(MainActivity.this);progressDialog.setProgress(0);progressDialog.setTitle("进度对话框");progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);progressDialog.setMax(MAX_PROGRESS);progressDialog.show();
newThread(newRunnable(){@Overridepublicvoidrun(){intprogress=0;while(progress<MAX_PROGRESS){try{Thread.sleep(100);progress++;progressDialog.setProgress(progress);}catch(InterruptedExceptione){e.printStackTrace();}}progressDialog.cancel();//关闭对话框}}).start();}}6.4课后同步练习对话框是常用的界面组件,被用于程序设计的多种场景中。现在要求编写一个Android注册程序的用户界面,注册的内容包括:姓名、出生日期、性别、联系地址、个人介绍等,界面还包括两个按钮,一个按钮用于确认:当用户点击确认按钮,收集注册信息,并显示在一个对话框中;另一个按钮用于重置:当用户点击重置按钮后,显示一个提示用户将重置信息的对话框,得到用户许可后重置用户输入的信息。6.5样式主题在创建Android工程时,会自动在工程的res/values资源目录下,生成一个名称为themes.xml的文件。这个文件用于配置应用程序的程序外观主题:在这个文件中定义的程序主题,与程序配置文件AndroidManifest.xml文件配合,就指定了应用程序的外观。为了直观看到这一点,先从一个具体的工程开始。6.5.1样式主题直观观察为了直观观察Android应用程序的样式主题,新建名称为ch0604的Android工程,然后打开res/values/themets.xml文件和AndroidManifes.xml文件,在界面上合理分开显示文件内容,如图所示。从图可以看出,在AndroidManifest.xml配置文件中通过如下语句定义了应用程序的样式主题:android:theme="@style/Theme.Ch0604">其中的“@style/Theme.Ch0604”指向了在themes.xml文件中定义的样式:<stylename="Theme.Ch0604"parent="Base.Theme.Ch0604"/>而样式“Theme.Ch0604”的父样式是“Base.Theme.Ch0604”,样式“Base.Theme.Ch0604”的父样式又是“Theme.Material3.DayNight.NoActionBar”:这是Android中预定义的样式。Android中预定义了许多样式主题。现在,在themes.xml文件,修改应用程序的主题样式,看看会有怎样的效果,为此,修改themes.xml文件为如下内容:<resourcesxmlns:tools="/tools"><!--Baseapplicationtheme.--><stylename="Base.Theme.Ch0604"parent="Theme.Material3.Dark"><!--Customizeyourlightthemehere.--><!--<itemname="colorPrimary">@color/my_light_primary</item>--></style>
<stylename="Theme.Ch0604"parent="Base.Theme.Ch0604"/></resources>6.5.2课堂同步练习创建一个Android工程,针在themes.xml文件中的在·样式主题,尝试选择Android平台预定义的不同样式主题,观察各个不同的样式主题的显示效果。6.5.3获取Application引用和动态修改样式主题对Android的每一个应用程序,Android平台在运行它时,都会为之创建一个全局唯一的称为Application的对象。因为这个Application对象对每个应用而言时全局唯一的,因此,可以用来在应用程序内部各个功能部件之间共享数据。Android的Applicaion也有其固有的生命周期方法,因此,可以在Application的生命周期方法中完成对应用程序的初始化工作。为了获得Application对象,需要两个步骤:其一,编写一个基础自Applicaion的类,覆写父类的onCreate()方法,在其中保存this对象:this对象就是Application类的实例;其二,在AndroidManfest.xml配置文件中启用这个子类作为应用程序的Application对象。下面举例说明如何获取Application和动态修改应用程序的样式主题。新建名称为ch0605的工程。在java代码包下新建名称为MyApplication的Java类,修改其代码为如下内容:packagecom.example.ch0605;
importandroid.app.Application;
publicclassMyApplicationextendsApplication{privatestaticMyApplicationinstance=null;privateinttheme=-1;
@OverridepublicvoidonCreate(){super.onCreate();instance=this;}
publicstaticMyApplicationgetInstance(){returninstance;}
publicvoidsetMyTheme(intresid){this.theme=resid;}
publicintgetMyTheme(){returntheme;}}然后,修改应用程序的AndroidManifest.xml配置文件为如下内容:<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"xmlns:tools="/tools">
<applicationandroid:name=".MyApplication"android:allowBackup="true"android:dataExtractionRules="@xm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 以爱为帆以智为桨班主任工作
- 2026年幼儿园不随手丢垃圾教案
- 数据要素流通的市场规模与增长趋势研究-专题研究报告
- 钢结构工程行业专题研究报告
- 建筑垃圾地表沉降观测方案
- 混凝土堵车应急方案
- 交通高温施工保障方案
- 加油站钢柱校正施工方案
- 高龄患者肠道准备质量评估体系的建立
- 高龄妊娠合并胆源性胰腺炎的内镜管理
- 2025国铁集团考试题库及答案
- 北京东城区2024-2025学年七年级下学期期末数学试卷(解析版)
- 综合行政执法面试题及参考答案
- 健康体重 快乐成长
- 邮政行测考试试题及答案
- 七年级语文上册《古代诗歌四首》理解性默写与训练
- T/GXAS 830-2024经桡动脉穿刺介入诊疗患者术肢管理规范
- T/CECS 10298-2023二阶反应型水性环氧沥青防水粘结料
- 广铁校招机考题库及答案
- 人教版九年级语文中考真题汇编 《简·爱》(2022-2024)全国中考语文真题
- 光储充一体化智能充电站项目可行性研究报告建议书
评论
0/150
提交评论