应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Android开发一个简单实用的闹铃APP

  一个简单的闹钟
  生活中我们会常常遇到需要闹钟提醒;不管是起床还是生活中的事件提醒。
  那作为Android开发如何自己开发一个闹钟功能呢,是不是觉得很酷呢?接下来我们就实战一个闹钟。效果视频
  闹钟子项子项布局效果图
  闹钟适配器类
  本示例采用的是RecyclerView,其适配器类与常无二,其异在于继承一个代理类,为适配之后侧滑删除而准备publicclassClockAdapterextendsWeSwipeProxyAdapterClockAdapter。ViewHolder
  建立一个内部类ViewHolder实现控件定义申明publicViewHolder(NonNullViewitemView){super(itemView);DeleteBtnitemView。findViewById(R。id。DeleteBtn);HouritemView。findViewById(R。id。Hour);SplititemView。findViewById(R。id。Split);MinitemView。findViewById(R。id。Min);LayoutitemView。findViewById(R。id。ItemLayout);ClockSwitchitemView。findViewById(R。id。ClockSwitch);}
  实现onCreateViewHolder方法载入子项布局文件publicViewHolderonCreateViewHolder(NonNullViewGroupparent,intviewType){ViewviewLayoutInflater。from(parent。getContext())。inflate(R。layout。clockitem,parent,false);returnnewViewHolder(view);}
  绑定实体类,实现onBindViewHolder获取数据publicvoidonBindViewHolder(NonNullfinalViewHolderholder,finalintposition){finalClockTimeclockTimetimeList。get(position);holder。Hour。setText(clockTime。getHour());holder。Split。setText(:);holder。Min。setText(clockTime。getMin());booleanisSelectclockTime。isSelect();if(isSelect){holder。ClockSwitch。setChecked(true);}else{holder。ClockSwitch。setChecked(false);}holder。DeleteBtn。setOnClickListener(newView。OnClickListener(){OverridepublicvoidonClick(Viewv){DeleteItem(position);}});holder。ClockSwitch。setOnCheckedChangeListener(newCompoundButton。OnCheckedChangeListener(){OverridepublicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){if(isChecked){SelectModel(holder,clockTime);}else{NormalModel(holder);}}});}闹钟初始数据
  此处有三处状态,第一种状态:第一次进入程序,默认加载固定闹钟子项;第二种状态:进入添加子项页面,然后返回其主页面,并判断其switch是否为ture,如果为ture则添加子项;第三种状态:程序被系统回收或者用户停止程序,并再次进入程序,防止加载前一时刻闹钟子项;默认数据privatevoidInitData(){if(flagSTART){for(inti6;i20;i2){ClockTimeclockTimenewClockTime(timeFormat。HandleHour(i),timeFormat。HandleHour(i),false);clockTimeList。add(clockTime);clockTime。setClockTimeList(clockTimeList);}}elseif(flagPAUSE){GetCallBackData();}else{Log。d(TAG,RestartApp);}}侧滑删除闹钟子项
  添加依赖实现侧滑主要依赖于一个第三方包,然后使用RecyclerView进行子项绑定依赖如下:implementationcom。github。WangcWj:WeSwipe:1。0。2implementationcn。wang。we:network:1。0。0
  并在目录build。gradle包下添加如下库maven{urlhttps:jitpack。io}布局设置
  其实现侧滑删除主要的玄机在于布局文件当中,使用RelativeLayout布局,将删除按钮固定在布局右方,并使用其他布局将其覆盖,只有滑动时,才将其显示。掩盖侧滑删除按钮与暴露侧滑删除按钮效果对比图如下
  实现侧滑回调方法
  然后,在适配器类中,实现WeSwipeHelper。SwipeLayoutTypeCallBack接口,实现如下三个方法,第一个方法为获取侧滑删除按钮的宽度;第二个方法为需要滑动的视图,也就是覆盖侧滑删除按钮的布局;第三个方法为当视图正在滑动时,用户触发单击事件,自动还原滑动状态floatgetSwipeWidth();获取侧滑删除按钮的宽度ViewneedSwipeLayout();ViewonScreenView();绑定RecyclerView
  最后,在需要添加子项的视图中绑定RecyclerView即可WeSwipe。attach(mRecyclerView);删除子项
  通过监听子项滑动删除按钮点击事件,实现子项删除holder。DeleteBtn。setOnClickListener(newView。OnClickListener(){OverridepublicvoidonClick(Viewv){DeleteItem(position);}});privatevoidDeleteItem(intposition){timeList。remove(position);notifyDataSetChanged();}新增闹钟子项序列化实体类
  跳转新增闹钟子项Acticity需要传输实体类对象,传输对象一般需要序列化改类,其操作如下
  定义实体类,并实现序列化publicclassClockTimeimplementsSerializable
  然后通过Intent传输Bundle对象publicvoidAdd(Viewview){flag1;IntentintentnewIntent(context,AddClockActivity。class);BundlebundlenewBundle();bundle。putSerializable(list,(Serializable)clockTimeList);intent。putExtras(bundle);startActivity(intent);}取出序列化实体类对象clockTimeList(ListClockTime)getIntent()。getSerializableExtra(list);TimePicker
  实现时间选择主要使用系统集成的组件TimePicker,其使用方法如下其有两种显示方式,第一种为spinner,就是下拉滑动式,第二种为clock,即显示一个时钟,通过滑动指针选择时间TimePickerandroid:ididTimePickerandroid:layoutwidthwrapcontentandroid:layoutheightwrapcontentandroid:timePickerModespinner自定义TimePicker文字大小及颜色
  在style。xml文件中申明如下样式stylenameThemePickerparentTheme。AppCompat。Light。NoActionBaritemnameandroid:editTextStylestyleWidget。Picker。StyleitemstylestylenameWidget。Picker。Styleparentandroid:styleWidget。EditTextitemnameandroid:textColorcolorcolorWhiteitemitemnameandroid:textSize15spitemstyle
  然后再指定Activcty申明即可activitypreh1classpgcharrowrightdatatrack62获取时间数据h1pdatatrack63spanstylecolor:333333;ttdarkmodecolor:A3A3A3;获取数据比较简单,实现对应接口即可spanprecodetimePicker。setOnTimeChangedListener(newTimePicker。OnTimeChangedListener(){OverridepublicvoidonTimeChanged(TimePickerview,inthourOfDay,intminute){mHourhourOfDay;mMinminute;}});返回时间数据
  将获取的数据通过SharedPreferences存储起来,然后点击存储时,进行页面跳转,然后再该界面进行取出数据
  存储数据sp。PutData(context,Hour,mHour);sp。PutData(context,Min,mMin);sp。PutData(context,isSelect,isSelect);取出数据
  首先判断回调的switch数据是否为ture,如果为ture则保存该子项,然后再适配器类中进行数据添加booleanaccess(Boolean)sp。GetData(context,access,false);if(access){intHour(int)sp。GetData(context,Hour,0);intMin(int)sp。GetData(context,Min,0);booleanisSelect(boolean)sp。GetData(context,isSelect,false);Log。d(TAG,HourfirstHour);Log。d(TAG,MinfirstMin);if(Hour0Min0){Log。d(TAG,null);}else{clockTimenewClockTime(timeFormat。HandleHour(Hour),timeFormat。HandleHour(Min),isSelect);adapter。AddItem(clockTime);}}else{Log。d(TAG,CancelSetAlarmClock);}子项添加publicvoidAddItem(ClockTimeclockTime){timeList。add(clockTime);notifyDataSetChanged();}自定义Switch样式Switch效果如图
  选中与默认两种状态效果图如下
  创建thumb和track样式thumb样式
  创建一个选择器文件,有选中和默认两种状态selectorxmlns:androidhttp:schemas。android。comapkresandroiditemandroid:statecheckedtrueandroid:drawabledrawableopenthumbitemandroid:drawabledrawableshutthumbselector选中状态
  创新openthumb。xml文件lt;?xmlversion1。0encodingutf8?shapexmlns:androidhttp:schemas。android。comapkresandroidandroid:shaperectangle!高度40sizeandroid:height20dpandroid:width20dp!圆角弧度20cornersandroid:radius10dp!变化率gradientandroid:endColoreeeeeeandroid:startColoreeeeeestrokeandroid:width1dpandroid:color33da33shape默认状态
  创建shutthumb。xml文件lt;?xmlversion1。0encodingutf8?shapexmlns:androidhttp:schemas。android。comapkresandroidandroid:shaperectanglesizeandroid:height20dpandroid:width20dp!圆角弧度20cornersandroid:radius10dp!变化率gradientandroid:endColoreeeeeeandroid:startColoreeeeeestrokeandroid:width1dpandroid:color666666shapetrack样式
  同样创建一个选择器,并用于两种状态lt;?xmlversion1。0encodingutf8?selectorxmlns:androidhttp:schemas。android。comapkresandroiditemandroid:statecheckedtrueandroid:drawabledrawableopentrackitemandroid:drawabledrawableshuttrackselector选中状态lt;?xmlversion1。0encodingutf8?shapexmlns:androidhttp:schemas。android。comapkresandroidandroid:shaperectangle!高度30此处设置宽度无效sizeandroid:height20dp!圆角弧度15cornersandroid:radius10dp!变化率定义从左到右的颜色不变gradientandroid:endColor2EA803android:startColor2EA803shape默认状态lt;?xmlversion1。0encodingutf8?shapexmlns:androidhttp:schemas。android。comapkresandroidandroid:shaperectanglesizeandroid:height20dpandroid:width20dpcornersandroid:radius10dpgradientandroid:startColoreeeeeeandroid:endColoreeeeeestrokeandroid:width1dpandroid:color666666shape闹钟提醒服务Service创建一个服务类
  其中AlarmManager为系统主要操作类,参数为提醒模式、提醒时间(long型)、PendingIntent对象以下有三种时间传入,第一种,直接传入一个Long型时间用于测试,第二种,通过设置系统启动至今而设置时间,第三种,通过取出设置的时间,然后获取系统当前时间,将其差传入其中。publicclassClockServiceextendsService{privateIntentintent;privatePendingIntentpendingIntent;privateAlarmManageralarmManager;privateintHour,Min;privateCalendarcalendar;NullableOverridepublicIBinderonBind(Intentintent){returnnull;}OverridepublicintonStartCommand(Intentintent,intflags,intstartId){alarmManager(AlarmManager)getSystemService(ALARMSERVICE);calendarCalendar。getInstance();10秒,用于测试longMinutes60100060;longtriggerAtTimeSystemClock。elapsedRealtime()Minutes;alarmManager。set(AlarmManager。ELAPSEDREALTIMEWAKEUP,triggerAtTime,pendingIntent);理论Hourintent。getIntExtra(Hour,0);Minintent。getIntExtra(Min,0);Log。d(TAG,HourClockServiceHour);Log。d(TAG,MinClockServiceMin);calendar。setTimeZone(TimeZone。getTimeZone(GMT8:00));calendar。set(Calendar。HOUROFDAY,Hour);calendar。set(Calendar。MINUTE,Min);longclockTimecalendar。getTimeInMillis();longcurrentSystem。currentTimeMillis();longtimeclockTimecurrent;Log。d(TAG,clockTimeClock);Log。d(TAG,currentCurrent);Log。d(TAG,timeMillisecond);intentnewIntent(this,WarnActivity。class);pendingIntentPendingIntent。getActivity(this,0,intent,0);alarmManager。set(AlarmManager。RTCWAKEUP,time,pendingIntent);returnsuper。onStartCommand(intent,flags,startId);}OverridepublicvoidonDestroy(){super。onDestroy();alarmManager。cancel(pendingIntent);}
  然后再清单文件中注册服务serviceandroid:name。service。ClockServiceandroid:themestyleNotTitleBar开始服务
  使用Intent实现服务启动privatevoidStartService(){IntentintentnewIntent(this,ClockService。class);intent。putExtra(Hour,mHour);intent。putExtra(Min,mMin);startService(intent);}暂停服务
  杀死程序publicvoidExit(Viewview){killProcess。finishAll();}单例类
  本示例总共使用到了三个单例类:SP(SharedPreferences封装)、TimeFormat(时间数据格式封装)、KillProcess(杀死所有Activity)SP封装类
  SharedPreferencesKillProcess封装类
  KillProcessTimeFormat封装类ublicclassTimeFormat{privatestaticTimeFormattimeFormat;privateTimeFormat(){}publicstaticTimeFormatgetInstance(){if(timeFormatnull){sync();}returntimeFormat;}privatestaticsynchronizedvoidsync(){if(timeFormatnull){timeFormatnewTimeFormat();}}publicStringHandleHour(inthour){if(hour10){return0hour;}else{returnString。valueOf(hour);}}publicStringHandleWeek(intweek){Stringweekday;switch(week){case1:weekday星期一;break;case2:weekday星期二;break;case3:weekday星期三;break;case4:weekday星期四;break;case5:weekday星期五;break;case6:weekday星期六;break;case7:weekday星期七;break;}returnweekday;}}文末
  文章带这里就完成了一个简单的闹钟;Android开发还有许多更加更多的知识学习。进一步学习Android技术,我这里推荐这份笔记方便学习,我就放在私信,发送核心笔记或手册即可获取。朋友们可以免费领取!

关于投影幕布的误解,你都中招了吗?技术的进步改变着人们的生活,投影仪作为家庭影音的重要一员,为了使其能有更好的效果,人们开始追求与其相匹配的幕布搭配使用,而投影幕布市场却充满了各种虚假的噱头,今天就给大家揭露下……天冷不想起床,10道快手早餐,35分钟上桌,赖床也吃得营养美今天是国庆假期的倒数第二天,国庆以后,今年的假期也就全部休完了,迎来的将是紧张的学习和工作,而天气越发冷了,早上起床变得困难起来了,总想再睡5分钟,因此准备早餐的时间越短越好。……年度质感真旗舰真我realmeGT2大师探索版如果要问我2021年下半年给我印象最深的手机,那一定是真我realmeGT大师探索版了。尤其是旅行箱灰的配色,不得不让我怀念起没有疫情的那些年,我们可以随时带上行李箱来一场说走……还有这种操作?前中超外援行程匆忙,兄弟代其参加自己婚礼前中超河南嵩山龙门外援布亚图雷透露,由于赛程安排紧张,他没有参加自己的婚礼,而是由他的兄弟代为参加。在昨日欧联杯马尔默对阵迪德朗日的欧联资格赛中,布亚图雷迎来自己的首秀,……吴磊语录有八个字特别对,不忘初心牢记使命,就是在前进的道路上,我不会忘记选择了这份行业的初心,那使命的话就是,要做一个好演员的使命。我已经非常幸运得到了那么多的机会,更应该抓住这些机会……网曝诺基亚N88渲染图!高颜值强悍配置惹人爱诺基亚似乎在渲染图方面上瘾了,在最近一组关于诺基亚新N88的渲染图出现了,无论是在颜值还是配置方面都获得了不少网友们的关注。根据网络消息显示,诺基亚新N88的屏幕设计是亮……窦桂梅卖火柴的小女孩的教学实录(1)幸福天堂《卖火柴的小女孩》的教学实录(1)思考:1、超越既往的主题定位,既从现实的角度理解这是一个不幸的故事,也从文化的角度理解这是一个幸福的故事。在尊重儿童……51岁钟丽缇晒跳舞视频遭大量恶评,网友老了还是稳重点好近日,钟丽缇(Christy)在个人短视频平台晒出一段跳舞短片,引来不少网友争议。只见她身穿浅蓝色珠片上衣,搭配Legging,随着音乐摇摆。现年51岁的钟丽缇保养得宜,……OPPO三项外观专利获批机身背面均配辅助屏幕在魅族试水背面屏幕设计之后,包括小米、OPPO在内的手机厂商也在这方面有所尝试。继日前曝光的FindX4Pro专利之后,现在OPPO公司再次获得3项设计专利,其共同特点是机身背……estar巅峰对决击败狼队冲进总决赛,狼队上高就炸太可惜,顶大家好我是指尖,恭喜estarpro拿到第一张总决赛的入场券,4:3战胜狼队,不愧是S组第一出线的战队,历史交手,两个战队在季后赛八次交手,狼队终结了estar六次,但没想到最……中国篮球迎来利好!前CBA功勋主帅出山执教梯队,曾打造王朝球随着本月底中国篮协将召开代表大会,最近篮协主席姚明也是非常的忙碌!近期他也是接受了央视的专访,详细介绍了中国篮球的现状以及未来的一个发展方向,可以说为了中国篮球的发展姚明真可谓……数字化时代已到来,游戏技术已经成为各行新未来几年前,人们眼中的游戏,还停留在消遣娱乐的层面,说白了,游戏嘛,就是玩。但是,在现在这个时代,有几个人还敢说这话?毕竟游戏现在已经成立为了香饽饽,不少人都在这片沃土中发现……
留给广厦的机会不多了,辽宁的野心昭然若揭昨天的CBA总决赛第二场,辽宁全场有惊无险的拿下了比赛。核心后卫郭艾伦只得到4分。但是不耽误辽宁队其他的球员站出来接手比赛。辽宁阵容的厚度,可操作性,真是让王博指导,让广厦全队……刑侦悬疑连环画电话7600。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。……VSCode中值得推荐的常用的33个高效前端插件效率篇(二)VSCode是我们前端开发的一个强大的IDE,所以选择趁手好用的插件是提高开发效率,然后剩下的时间用来摸鱼是很有必要滴。效率篇(33)PathIntellisense……雨水节气,记得多吃三绿二红,少食三样,顺应节气平安过春天雨水节,是一个非常富有想象力和人情味的节气,在这一天,不管下不下雨都充满着一种雨意蒙蒙的诗情画意,人们也都在这一天以不同的形式乞求着顺利安康。俗话说:一年之计在于春,顺应节气特……美媒再支招湖人,恐将组建四巨头,克拉克斯顿发文引争议MBA常规赛正在如火如荼进行中,各支球队都在为季后赛席位而厮杀,湖人在近期再度伤停戴维斯,让湖人再遭打击,球队也恐将止步季后赛。美媒再支招湖人,恐将迎四巨头戴维斯的……赛博企鹅!玩家发现战地2042修理工具可维修企鹅最近就有一位玩家发现《战地2042》企鹅可以和载具一样进行维修!《战地2042》企鹅:从视频中我们可以发现,本来用于修复战场载具的修理工具被用在了企鹅身上,甚至出现……金刚碑元月25日开始限流入园北碚金刚碑自12月31日开街测试,元月15日试营业以来,由于独特的古镇风景、江景、灯光夜景、人文历史背景、巡江栈道、以及便利的交通等,收获颇多好评。但由于疫情的发展变化,及春节……助力冬奥!北京大学国际医院冬奥会医疗保障团队荣耀出征1月23日,北京大学国际医院召开2022北京冬奥会医疗保障团队出征仪式,一起向未来的口号响彻会场,在全体院领导班子、相关科室负责人的见证下,由46名一线医护组成的北京大学国际医……肝硬化别吃硬食物,这4类食物,病人要小心上消化道出血是肝硬化是最危险的并发症。急诊值班时,会遇到有的患者吃了没煮烂的排骨肉、有的患者吃坚果或者牛肉干时,不小心划破消化道血管,导致消化道大出血。临床实践中,能开展……追光冬奥里的中国之美冰墩墩为啥有个壳?北京冬奥会还没开幕冰墩墩就已经给全国人民可爱住了26日冰墩墩以卡门墩之姿实力冲上热搜!网友们也是绷不住了:快给我墩开个门啊!今冬顶流不……吕佳容自称花十万走红毯,但美成焦点,这钱花得值确凿非常多明星入席举止大概是走红毯的时分,都有特地本人的造型师和装束计划师,并且她们的衣服大多数都是经由私家订制而成的,因此穿在身上就相对合乎本人身上发放出来的气质,吕佳容此次……2022年山东省太阳能发电市场运行现状分析新增太阳能发电装机【能源人都在看,点击右上角加关注】电力行业主要上市公司:目前国内电力行业的上市公司主要有华能国际(600011)、国电电力(600795)、大唐发电(601991)、华电……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网