Android课堂笔记(九)——消息条、对话框、闹铃

目录

一.消息通知

1.消息条通知

1.1 预定义的标准消息条

1.2 自定义消息条

1.3 普通消息条、指定位置消息条、自定义消息条实例

2.对话框通知

2.1 警告对话框-AlertDialog / 进度条对话框-ProgressDialog

2.2 日期/时间选择对话框-Date/TimePickerDialog / 自定义对话框

二.闹铃

3.1 创建一次性闹铃

3.2 创建重复闹铃


一.消息通知

  • 用于通知用户事件的技术:
  1. 消息条通知(Toast):用于简短消息,不可交互
  2. 对话框通知(Dialog):用于显示进度栏 / 要求用户确认的短消息,可交互

1.消息条通知

1.1 预定义的标准消息条

  • 使用预定义的标准消息条:显示单行信息,几秒钟后自动消失,用户不可交互
  • 创建消息条的标准方法: android.widget.Toast.makeText(context, text, duration);
  1. Context:显示消息条的应用/活动
  2. text:要显示的消息
  3. Duration:显示消息的时间范围
  4. android.widget.Toast类的 show()方法:显示消息
  • setGravity() 方法:定位消息条通知
  • xOffset:以像素为单位的X坐标偏移量,yOffset以像素为单位的Y坐标偏移量
  • Toast toast = Toast.makeText(getApplicationContext(),"Hi", Toast.LENGTH_LONG);
                  toast.setGravity(Gravity.BOTTOM|Gravity.LEFT, 0, 0);
                  toast.show();

1.2 自定义消息条

  1. 布局文件中 创建消息条布局:
  2. 通过 java代码 动态添加消息属性

1.3 普通消息条、指定位置消息条、自定义消息条实例

  • 区分:
  • getLayoutInflater():获取布局文件,动态添加
  • findViewById::获取布局文件中的单个组件
public class MainActivity extends Activity {
    // 声明、获取组件,注册噢监听器...
  class ButtonListener implements OnClickListener{
    	@Override
		public void onClick(View v) {
    		switch(v.getId()){
    		case R.id.button1:
Toast.makeText(MainActivity.this,"普通的Toast",Toast.LENGTH_SHORT).show();
				break;
			case R.id.button2: // 水平/垂直方向:LEFT,RIGHT,CENTER / TOP,CENTER,BOTTOM
Toast t2=Toast.makeText(MainActivity.this,"指定位置的Toast", Toast.LENGTH_SHORT);
t2.setGravity(Gravity.LEFT|Gravity.BOTTOM, 80, 60);
				t2.show();
				break;
			case R.id.button3:
				makeMyToast("自定义的Toast",R.drawable.c);
				break;
			}}}
    
    void makeMyToast(String text,int imageId){              // 自定义消息(文本,图片)
    	Toast t3=new Toast(MainActivity.this);
    	t3.setDuration(Toast.LENGTH_LONG);                  // 设置显示时间
    	t3.setGravity(Gravity.CENTER|Gravity.BOTTOM, 0, 0); // 设置显示位置

    	ViewGroup vg=(ViewGroup)findViewById(R.id.toastLayout);  // 自定义消息布局文件
    	ImageView iv=(ImageView)v.findViewById(R.id.toastIV);
    	TextView tv=(TextView)v.findViewById(R.id.toastTV);
    	iv.setImageResource(imageId); 
        tv.setText(text);//设置该TextView的显示文本
        //获取布局填充器,填充视图内容:把自定义消息布局文件 填充到主布局文件中
    	View v=getLayoutInflater().inflate(R.layout.custom_toast, vg);

    	t3.setView(v); //设置Toast的显示内容为你定义好的视图
    	t3.show();
    }}
  •  Android课堂笔记(九)——消息条、对话框、闹铃_第1张图片

2.对话框通知

  • 对话框(Dialog):在当前活动之上显示的一个小窗口
  • 对话框用于:打断用户 / 执行与当前应用有关任务的通知 
  • Dialog类 充当创建所有对话框的 基类
  • 要将 Dialog类 实例化,应使用以下子类之一:
  1. AlertDialog:警告对话框
  2. ProgressDialog:进度条对话框
  3. DatePickerDialog:日期选择对话框
  4. TimePickerDialog:时间选择对话框

2.1 警告对话框-AlertDialog / 进度条对话框-ProgressDialog

  • 最灵活的对话实现方式,包括普通警告对话框、带列表的警告对话框
  • 创建警报对话框,可使用 AlertDialog.Builder 子类:
  • AlertDialog.Builder builder = new AlertDialog.Builder(this);
  • 警报对话框三个按钮:Positive button(肯定)、Negative button(否定)、Neutral button(中立)
  • setItems()方法为警报对话框 添加列表视图
  • 如果匿名类想访问 同方法中的另一变量,那么这个变量必须是 常量final
  • 进度条对话框:ProgressDialog:AlertDialog类 的扩展,以 旋转环 / 水平进度条 的形式显示操作进度
  1. ProgressDialog.STYLE_HORIZONTAL:水平进度条
  2. ProgressDialog.STYLE_SPINNER:旋转环进度条
public class MainActivity extends Activity {
    // 声明、查找组件,注册监听器...
	class ButtonListener implements OnClickListener {
		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.button1:
				// 创建警告对话框
				AlertDialog.Builder builder = new AlertDialog.Builder(
						MainActivity.this);
				builder.setTitle("退出确认"); // 设置对话框标题
				// 设置对话框的图标:getResources().getDrawable获取静态资源
				builder.setIcon(getResources().getDrawable(R.drawable.h));
				builder.setMessage("您真的真的要退出程序吗?"); // 设置对话框显示的消息
				// 设置确定按钮的显示文本和点击监听器
				builder.setPositiveButton("是",
						new DialogInterface.OnClickListener() { // 点击是后,执行的操作
							@Override
							public void onClick(DialogInterface arg0, int arg1) {
								MainActivity.this.finish(); // 退出程序
							}});
				// 设置否定按钮的显示文本和点击监听器
				builder.setNegativeButton("否",
						new DialogInterface.OnClickListener() {
							@Override
							public void onClick(DialogInterface arg0, int arg1) {
								Toast.makeText(MainActivity.this,
										"哈哈,我就知道你不会退出!", Toast.LENGTH_SHORT)
										.show();
							}});
				builder.show(); // 弹出对话框
				break;

			case R.id.button2:
				// 创建列表警告对话框
				AlertDialog.Builder builder2 = new AlertDialog.Builder(
						MainActivity.this);
				builder2.setTitle("请选择一个国家");
				// 如果一个匿名类想访问同一个方法中的另外一个变量,那么这个变量必须是常量final
				final String[] countries = { "China", "USA", "UK", "Korea",
						"Japan" };
				// setItems()方法:设置对话框显示的列表和对应的监听器
				builder2.setItems(countries,
						new DialogInterface.OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
								b2.setText(countries[which]);
							}});
				builder2.show();

				break;
			case R.id.button3:
				pd1 = new ProgressDialog(MainActivity.this);
				pd1.setTitle("下载进度");
				pd1.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
				// STYLE_HORIZONTAL, STYLE_SPINNER
				pd1.setMax(100); // 设置最大值,就是完成时的进度值
				pd1.show();

				ChildThread1 t1 = new ChildThread1(); // 单独开一个线程,更新进度条
				t1.start();
				break;
			case R.id.button4:
				pd2 = new ProgressDialog(MainActivity.this);
				pd2.setTitle("下载提示");
				pd2.setMessage("下载中......");
				// 转圈的不确定进度的进度对话框,完成后一般退出对话框即可
				pd2.setProgressStyle(ProgressDialog.STYLE_SPINNER);
				pd2.show();

				ChildThread2 t2 = new ChildThread2(); // 单独开一个线程,更新进度条
				t2.start();
				break;
			}}}

	class ChildThread1 extends Thread { // 更改进度条
		@Override
		public void run() {
			for (int i = 1; i <= 100; i++) {
				try {
					Thread.sleep(50); // 每隔 0.05s 更新一次
					pd1.setProgress(i); // 更改进度条的进度值
				} catch (InterruptedException e) {
					Log.e("MainActivity", e.getMessage());
				}}}}

	class ChildThread2 extends Thread {
		@Override
		public void run() {
			try {
				Thread.sleep(3000); // 3s
				pd2.dismiss();      // 退出对话框
			} catch (InterruptedException e) {
			}}}}
  •  普通警告对话框,点击是退出应用,点击否出现消息条:
  • Android课堂笔记(九)——消息条、对话框、闹铃_第2张图片
  • 带列表的普通警告对话框,点击选项,重置选项文本信息:
  • Android课堂笔记(九)——消息条、对话框、闹铃_第3张图片
  • 水平 / 旋转环 进度条:
  • Android课堂笔记(九)——消息条、对话框、闹铃_第4张图片

2.2 日期/时间选择对话框-Date/TimePickerDialog / 自定义对话框

  • Calendar.getInstance():获取 Calendar实例,Calendar类,即日历类,是抽象类
  • DatePickerDialog类-选择当前日期,TimePickerDialog类-选择当前时间,提供方法:
  1. getDatePicker():在对话框中检索日期选择器,返回日历视图
  2. onClick(DialogInterface dialog, int which):单击对话框按钮执行
  3. onDateChanged(DatePicker view, int year, int month, int day):日期改变执行
  4. onTimeChanged(TimePicker view, inthourOfDay, int minute):时间改变执行
  5. onRestoreInstanceState(Bundle savedInstanceState):从当前状态恢复对话框原始状态
  6. onSaveInstanceState():保存对话框状态
  7. updateDate(int year, int monthOfYear, int dayOfMonth):设置日期
  8. updateTime(inthourOfDay, intminutOfHour):设置时间
  • 创建自定义对话框,需指定自己的对话框布局:
  • 定义布局后,将 布局资源ID 传递到 setContentView(View)方法
public class MainActivity extends Activity {
    // 声明、获取组件,注册监听器...
    class MyListener implements OnClickListener{
		@Override
		public void onClick(View v) {
			switch(v.getId()){
			case R.id.tvDate:
				// 操作日期Calendar类(日历类)
				Calendar cal=Calendar.getInstance(); //获取Calendar实例
				// 获取当前系统的年份、月份和日子
				int YY=cal.get(Calendar.YEAR);
				int MM=cal.get(Calendar.MONTH);
				int DD=cal.get(Calendar.DAY_OF_MONTH);
				// 参数5个:上下文路径,监听器,年份,月份,日
				DatePickerDialog d1=new DatePickerDialog(MainActivity.this,new OnDateSetListener(){
					@Override // 当日期设定时,该方法自动被调用,并自动传入选中日期
					public void onDateSet(DatePicker view, int year,
							int month, int day) {
						tvDate.setText(year+"-"+(month+1)+"-"+day);
					}
				},YY,MM,DD);
				d1.show();
				break;
			case R.id.tvTime:
				Calendar cal2=Calendar.getInstance();
				int hhs=cal2.get(Calendar.HOUR_OF_DAY);
				int mms=cal2.get(Calendar.MINUTE);
				// 5个参数:上下文,监听器,显示的小时,显示的分钟,是否使用24小时制
				TimePickerDialog d2=new TimePickerDialog(MainActivity.this,new OnTimeSetListener(){  
					@Override //当时间设定的时候,自动调用该方法,并自动传入选中时间
					public void onTimeSet(TimePicker view, int hourOfDay,
							int minute) {
							tvTime.setText(hourOfDay+":"+minute);
					}},hhs,mms,true);
				d2.show();
				break;
			case R.id.tvCD:
				Dialog d3=new Dialog(MainActivity.this); // 自定义对话框,创建Dialog对象
				d3.setContentView(R.layout.custom_dialog); // 设置自定义对话框布局资源id
				d3.setTitle("查找文本");
				Button b=(Button)d3.findViewById(R.id.andy); // 对查找到的视图进行操作
				b.setOnClickListener(new OnClickListener() {
					@Override
					public void onClick(View v) {
						Toast.makeText(MainActivity.this,"查找到内容",Toast.LENGTH_SHORT).show();
					}});
				d3.show();
				break;
			}}}}
  • 日期:Android课堂笔记(九)——消息条、对话框、闹铃_第5张图片
  • 时间:Android课堂笔记(九)——消息条、对话框、闹铃_第6张图片
  • 自定义:Android课堂笔记(九)——消息条、对话框、闹铃_第7张图片

二.闹铃

  • 闹铃:独立服务,在预定时间触发意图,可以 一次触发 或 重复触发
  • 可以在应用的作用域之外设置,用于触发应用的事件/操作,比如关机后依旧运行
  • android.app.AlarmManager类 提供闹铃类型的常量,包括:
  • RTC_WAKEUP:在指定时间唤醒设备,触发意图
  • RTC:设备处于睡眠状态时触发意图,不在设备关闭时触发意图,定义闹铃的预定义常量
  • INTERVAL_HALF_HOUR :闹铃所设置时间半小时后触发
  • INTERVAL_HALF_DAY
  • INTERVAL_FIFTEEN_MINUTES
  • INTERVAL_DAY
  • ELAPSED_REALTIME :根据设备睡眠的时长触发意图,不唤醒设备
  • ELAPSED_REALTIME_WAKEUP :根据设备睡眠的时长触发意图,唤醒设备
  • android.app.AlarmManager类  提供闹铃类型的方法,包括:
  • cancel(PendingIntent task):取消闹铃,PendingIntent:待执行的意图(非立即执行)
  • set(int type, long triggerAtTime, PendingIntenttask):设置一次性闹铃
  • setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation):设置重复闹铃
  • setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent task):设置重复闹铃
  • setTime(long time):设置系统时间
  • setTimeZone(String timeZone):设置时区

3.1 创建一次性闹铃

  • set()方法 设置一次性闹铃,参数如下:
  • type:四种可用类型之一,例如 RTC 或 ELAPSED_REALTIME
  • triggerAtMillis:闹铃响起时的时间(以毫秒为单位)
  • operation:闹铃响起时必须执行的操作

3.2 创建重复闹铃

  • setRepeating()方法 设置重复闹铃,参数如下:
  • type:四种可用类型之一,例如 RTC 或 ELAPSED_REALTIME
  • triggerAtMillis:闹铃响起时的时间(以毫秒为单位)
  • interval:重复多久再次启动闹铃
  • operation:闹铃响起时必须执行的操
// MainActivity.java
public class MainActivity extends Activity {
	    AlarmManager manager;// 1:声明组件 闹铃任务都是由闹铃管理器管理的
        // 注册监听器....
        // getSystemService():获取指定的系统服务,返回对应的服务管理器
        manager=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
    }
    class ButtonListener implements OnClickListener{
		@Override
		public void onClick(View v) {
			switch(v.getId()){
			case R.id.button1:
				Calendar cal=Calendar.getInstance(); // 获取日历对象
				int hh=cal.get(Calendar.HOUR_OF_DAY);
				int mm=cal.get(Calendar.MINUTE);
				TimePickerDialog td=new TimePickerDialog(MainActivity.this,new OnTimeSetListener(){
					@Override
					public void onTimeSet(TimePicker view, int hourOfDay,
							int minute) {
						Calendar newcal=Calendar.getInstance(); // Calendar实例 存储设定时间
						newcal.set(Calendar.HOUR_OF_DAY, hourOfDay);
						newcal.set(Calendar.MINUTE,minute);
						newcal.set(Calendar.SECOND,0);		
						Intent intent=new Intent(MainActivity.this,AlarmActivity.class);
						// Intent是立刻执行的意图,为了在指定的时刻执行
						// 需要定义一个PendingIntent(待定的Intent)来封装Intent
						// 四个参数:上下文,请求码(整数),要执行的intent,Flag标记(整数)
						pi=PendingIntent.getActivity(MainActivity.this,0,intent,0);
						// 设置一次性闹铃服务
						long time=newcal.getTimeInMillis(); // 将时间转成毫秒表示
						// 三个参数:闹铃类型,启动任务的时间,要执行的PendingIntent
     					// manager.set(AlarmManager.RTC_WAKEUP,time,pi);
						
						// 设置重复的任务,第三个参数为重复的时间间隔
						manager.setRepeating(AlarmManager.RTC_WAKEUP, 
								time, 1000*10, pi);
						Toast.makeText(MainActivity.this,"闹钟设置成功", Toast.LENGTH_SHORT).show();
					}
				},hh,mm,true);
				td.show();
				break;
			case R.id.button2:
				manager.cancel(pi); // 取消闹铃任务
				Toast.makeText(MainActivity.this,"取消闹钟成功", Toast.LENGTH_SHORT).show();
				break;
			}}}}
// Activity1.java
public class AlarmActivity extends Activity{
	MediaPlayer player; // 声明音乐播放组件对象
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_two);
		player=MediaPlayer.create(AlarmActivity.this,R.raw.alarm1);
		// player.setLooping(true); // 设置音乐循环
		player.start();
		AlertDialog.Builder dd=new AlertDialog.Builder(AlarmActivity.this);
		dd.setTitle("闹钟提醒");    // 设置对话框标题
		dd.setMessage("快起床啦狗比特!");
		dd.setPositiveButton("我知道了",new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				player.stop();               //停止音乐
				AlarmActivity.this.finish(); //结束当前活动
			}});
		dd.show();
	}}
  • Android课堂笔记(九)——消息条、对话框、闹铃_第8张图片

 

你可能感兴趣的:(Android,android)