赞
踩
2021SC@SDUSC
目录
“晃动取消闹钟”是一个基于手机陀螺仪的app,当用户定的闹钟响时,用户需晃动闹钟30次才能关闭闹钟,这样能更有效地帮助用户起床。
此app分为三个页面——主页面、定闹钟页面、响铃页面。主要功能为设置/取消闹钟、闹钟响铃、摇一摇取消闹钟。
此app主要代码在于如何获取手机当前时间并对闹钟时间进行设置(需判断今日还是明日)和如何在设定时间内响铃并呈现响铃页面。下图为响铃页面:
Android Switch允许我们在两个状态之间切换,有点类似现在的滑动解锁。外观上可同时显示出开、关的文本,有利于引导用户操作。Switch属性如下图:
Android TimePicker是一个时间选择器,主要用于选择时间,可以是24小时制的或是AM/PM12小时制。
属性
android:theme为指定字体颜色及大小用到的。
android:datePickerMode:控件显示方式 clock或spinner.
getCurrentHour():获取当前选择的时间,如果minSdkVersion >=23推荐使用getHour()
getCurrentMinute():获取当前选择的分钟,如果minSdkVersion >=23推荐使用getMinute()
setCurrentHour():获取当前选择的时间,如果minSdkVersion >=23推荐使用setHour()
setCurrentMinute():获取当前选择的分钟,如果minSdkVersion >=23推荐使用setMinute()
is24HourView():获取当前组件是否为24小时模式
setIs24HourView():设置当前组件是否为24小时模式
Intent是Android常用的一个用于组件间互相通信的信息对象,常用于启动组件和传递数据。
显示Intent是在创建Intent对象时就指定接收者。在启动 Activity 时必须在 Intent 中指明要启动的 Activity 所在的类。当需要启动其他 Activity 时,同样需要应用 Intent 和 startActivity() 方法来启动需要的 Activity。
Intent(Context packageContext,Class<?> cls)构造一个指定目标组件的 Intent,显式 Intent 的主要构造方法。
Intent用于通过描述开发者想在某个Intent对象中执行的简单操作来启动另一应用中的某个Activity。这种Intent称作隐式Intent,因为它并不指定要启动的应用组件,而是制定一项操作并提供执行该操作所需的一些数据。
intent中提供一系列的putExtra()方法的重载,可以把想要传递的数据暂存在intent中,当另一个活动启动后,再把这些数据从intent缓存中取出即可。
Bundle主要用于传递数据,它保存的数据,是以key-value的形式存在的。
Bundle经常使用在Activity之间或者线程间传递数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。
当Bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口。
Bundle提供了各种常用类型的putXxx()/getXxx()方法,用于读写基本类型的数据。
Bundle只是一个信息的载体,内部其实就是维护了一个Map<String,Object>
Intent负责Activity之间的交互,内部是持有一个Bundle的。
如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法。
startActivityForResult(Intent intent, int requestCode)
该方法的第一个参数是intent,第二个参数是请求代码。请求代码先发送给子activity,然后再返回给父activity的用户定义整数值。当一个activity启动多个不同类型的子activity,且需要判断区分消息回馈方时,通常会用到该请求代码
setResult(int resultCode)
setResult(int resultCode,Intent data)
一般来说,参数resultCode可以是Activity.RESULT_OK、Activity.RESULT_CANCELED这两个预定义常量中的任何一个。
这个函数是在ViewGroup里定义的,主要用于控制child View获取焦点的能力,比如是否阻止child View获取焦点。
FOCUS_BEFORE_DESCENDANTS ViewGroup本身先对焦点进行处理,如果没有处理则分发给child View进行处理
FOCUS_AFTER_DESCENDANTS 先分发给Child View进行处理,如果所有的Child View都没有处理,则自己再处理
FOCUS_BLOCK_DESCENDANTS ViewGroup本身进行处理,不管是否处理成功,都不会分发给ChildView进行处理
此页面为线性布局,所以使用<LinearLayout></LinearLayout>作为根元素。再添加两个<TextView></TextView>和<ImageView></ImageView>,还嵌套了一个水平<LinearLayout></LinearLayout>表示闹钟时间。嵌套的水平LinearLayout中有一个TextView表示时间,一个Switch开关来设置/取消闹钟。
此页面为线性布局,所以根元素为<LinearLayout></LinearLayout>,在里层添加一个TimePicker来选择时间,再添加一个Button来提交闹钟。
此页面较为简单, 线性布局<LinearLayout></LinearLayout>为根元素,在里层添加三个TextView分别表示三个不同的文本。
开启app首先进入主页面,点击主页面的时间TextView可进入闹钟设置页面,因此需要给TextView添加点击监听。
首先获得主页面特定的表示时间的TextView
然后调用setOnClickListener()方法为此TextView添加点击监听。
通过Intent的构造方法创建一个指定目标组件的显示 Intent,指明要启动的Activity为settime(设置时间)Activity。
再调用startActivityForResult()方法来获得闹钟设置Activity关闭并需要返回给主页Activity的数据。
首先通过控件属性id获取时间设置页面中的TimePicker
再通过调用setIs24HourView()设置时间是否是24小时制显示
通过调用setDescendantFocusability()传入FOCUS_BLOCK_DESCENDANTS参数,不会分发给ChildView进行处理,禁用键盘输入。
再给此TimePicker设置时间改变监听,当时间改变时,得到TimePicker上选择的hour和minute并且存入thehour和themin中,方便后续返回给主页面。
首先通过控件属性id获取时间设置页面中的Button
给按钮增加点击事件监听
重写onClick()来定义点击事件触发后的操作
先调用Intent和Bundle的构造函数创建Intent和Bundle实例,再将想要传给主页面的数据以键值对形式放进Bundle实例中,再调用intent.putExtras(bundle)将想要传递的数据暂存在intent中,当主页面Avtivity启动后,再把这些数据从intent缓存中取出即可。
再调用setResult设置从设置时间子Activity返回到主页面的返回结果类型
最后调用finish()结束设置事件这个Activity的生命周期。由于前文主Activity使用了startActivityForResult(),此方法会开启新的Activity ,子Activity关闭后会向主Activity传回数据,因此可以得到用户设置的时间。
当点击了返回键,未设置时间则只需将设置闹钟子Activity标识返回给主页面并结束设置闹钟子Activity
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。