呆呆的猫
爱发呆 爱抹茶 一直在路上
展开
-
【kotlin】1、enum 与 sealed class
例如下例,新建 Operation 类,其有4个 sub class,编译器在 execute() 函数的 when() 中会替我们检查,是否将全部的 4个 sub class 都考虑到了。Kotlin 除了 Enum,还有 Sealed Class,它可以限制 sub class 的种类,方便使用者知道范围,更易用。我们可以用 sealed class 来设计库,让使用者必须考虑所有 sub class 的情况,防止遗漏,是一个优秀的设计范式。原创 2022-10-09 11:56:32 · 118 阅读 · 0 评论 -
【Android进阶】21、样式与主题
Android的样式与主题原创 2022-09-15 00:05:06 · 348 阅读 · 0 评论 -
【Android进阶】20、音频播放:SoundPool 类、单元测试:Espresso框架
在showsFirstFileName()函数里,onView(withText(“65_cjipie”))这行代码会找到显示“65_cjipie”的视图,对其执行测试。在Android平台上,整合测试通常还是指UI级别的测试(和UI部件交互,验证它们的行为表现是否符合预期)。)函数是Espresso版的断言函数。在 BeatBox 中添加 play(Sound) 函数即可播放音频,其中 SoundPool.play() 函数的参数分别是 音频ID、左音量、右音量、优先级、是否循环、播放速率。原创 2022-09-15 00:04:30 · 457 阅读 · 0 评论 -
【Android进阶】19、MVVM 数据绑定、用 BaseObservable() 的 notifyChange() 通知数据变动、自定义的 BindingAdapter
这里,调用 notifyChange() 函数,就是通知绑定类,视图模型对象上所有可绑定属性都已更新。所以,setSound(Sound) 函数一被调用,ListItemSoundBinding 立即就会知道,并调用list_item_sound.xml 布局里指定的 Button.setText(String) 函数。然而,如果只想在代码中直接调用文件,那么assets就有优势了。随着项目越来越复杂,必然需要设计模式来抽象软件各模块分层,MVVM 架构可以把控制器的代码,放到布局文件和视图模型层中。原创 2022-09-15 00:04:20 · 699 阅读 · 0 评论 -
【Android进阶】17、设置中文:语言地区的本地化、国际化
而Android Studio打包时会检查此项。,但设置为意大利语言时,就会因找不到资源而报错。,通过设置地区,让os自动找对应版本。我们设置中文版和英文版两个版本的。如果只有中英文版本的。原创 2022-09-15 00:04:08 · 1166 阅读 · 0 评论 -
【Android进阶】16、用 intent 拍照、用 FileProvider 存照片、用 Bitmap 展示图片、用 BitmapFactory 放大缩小图片
新增2个View对象,显示照片缩略图的ImageView,和拍照按钮。UI 如下图所示:首先在 中添加 ImageView 和 ImageButton,完整的布局文件如下:效果如下:在 CrimeFragment.kt 中添加新属性,代码如下:16.2 文件存储照片存储较大,需要放置在私有存储空间中,有如下几个API:如果只有你自己 的应用能读写。不过,如果存储的文件仅供应用内部使用,上述各类函数也够用了。但如果其他应用要读写你的文件,事情就没那么简单了。CriminalIntent应用就是这个情况原创 2022-09-15 00:03:57 · 761 阅读 · 0 评论 -
【Android进阶】15、隐式 intent:选择通讯录的联系人、发短信、打电话
在Android系统中,可利用隐式intent启动其他应用的activity。例如下文,我们会利用隐式intent打开联系人和短信:对于开发者来说,使用隐式intent利用其他应用完成常见任务,远比自己编写代码从头实现要容易得多。对于用户来说,他们也乐意在应用中调用自己熟悉或喜爱的应用。创建隐式intent之前,需完成以下准备工作:我们会在CrimeFragment布局中添加两个投诉用按钮:首先在 中添加字符串资源如下:添加布局如下:其布局效果如下:在 中添加一个属性,如下:因为数据库表添加了一列原创 2022-09-15 00:03:45 · 1201 阅读 · 0 评论 -
【Android进阶】14、theme 主题 和 menu 顶部应用栏
菜单是一种类似于布局的资源。创建菜单定义文件并将其放置在res/menu目录后,Android会自动生成相应的资源ID。随后,在代码中实例化菜单时,就可以直接使用。右键单击res目录,选择New → Android resource file菜单项。代码如下:原创 2022-09-15 00:03:31 · 929 阅读 · 0 评论 -
【Android进阶】13、用 Callbacks 在 Fragment 间传参数、DatePickerDialog 和 TimePickerDialog 两种时间选择器
修改某项Crime的日期,确认CrimeFragment视图显示了新日期。既然CrimeFragment能响应新日期,在用户选了日期后,DatePickerFragment就需要把日期传递出去。用户选择的日期是年、月、日的形式,我们把年、月、日数据传给GregorianCalendar,再访问它的 time 属性得到需要的Date对象。要传递crime的日期给DatePickerFragment,需新建一个newInstance(Date)函数,然后将Date作为argument附加给fragment。原创 2022-09-15 00:03:17 · 553 阅读 · 0 评论 -
【Android进阶】12、单 Activity 多 Fragment 和 Fragment Navigation 导航
数据库查询结束,CrimeFragment 的 crimeDetailViewModel.crimeLiveData数据观察者会得到通知,它随即就更新了部件上要显示的数据,所以用户会看到 checkbox 的勾选动画。对于这样的fragment,谁托管它,谁就得实现它定义的接口。接下来,如下述代码所示,在CrimeHolder.onClick(View)函数里,调用Callbacks接口的onCrimeSelected(Crime)函数,响应用户点击crime列表项事件。原创 2022-09-15 00:03:03 · 1289 阅读 · 0 评论 -
【Android进阶】11、操作数据库:Room 库、Entity 实体、Dao 层、repository 模式和 LiveData
Room基于你定义的实体为应用构建数据库表。实体是你创建的模型类,使用@Entity注解。使用@Entity注解一个类,然后交给Room处理,一张数据库表就诞生了。要想在数据库里保存Crime对象,你需要把Crime类改造为Room实体。在database包里,添加一个名为CrimeDao.kt的新文件。}原创 2022-09-15 00:02:42 · 1015 阅读 · 0 评论 -
【Android进阶】10、用 ConstraintLayout 来布局
如果需要给 RecyclerView 列表项添加样式,则需要用 ConstraintLayout。ConstraintLayout最适合用来设计扁平或是复杂又漂亮的非嵌套布局,心智负担更小。其中蓝图可显示 View 的轮廓,而预览视图可看到预览效果。文件夹中,放置资源图片。原创 2022-09-14 10:30:42 · 288 阅读 · 0 评论 -
【Android进阶】9、用 ViewHolder 和 Adapter 显示 RecyclerView 列表
每一个 列表项view 展现的是数据集合里的单个对象(在CriminalIntent应用里,指的是crime集合里的某项crime事件)。过去传统的实现方式现已被RecyclerView的实现方式取代,因此不用再费力地调整 ListView 和 GridView 的工作行为了,而是用 RecyclerView代替了。首先来实现简单的列表项显示,即每个列表项只显示crime事件的标题和日期,即每一行的View对象都是一个包含两个TextView部件的LinearLayout。原创 2022-09-14 10:29:31 · 625 阅读 · 0 评论 -
【Android进阶】8、单 Activity-多 Fragment 模式 与 FragmentManager 管理器
定义 UI 布局文件创建 fragment 类并设置其视图为第一步定义的布局编写代码以实例化部件首先在中添加字符串资源原创 2022-09-14 10:27:34 · 895 阅读 · 0 评论 -
【Android进阶】7、Android 各 SDK 版本的区别与兼容
然而,受益于Android Lint的不断改进,现在在老版本系统上调用新版本代码时,在编译时就能发现潜在问题。也就是说,如果使用了高版本系统API中的代码,Android Lint会提示编译错误。Jetpack库除了提供新功能(比如ViewModel),还支持新功能向后兼容,尽量让新老设备保持一致的用户体验。例如,在GeoQuiz应用中,如果调用了Lollipop(API 21级)以后的SDK版本中的代码会怎么样呢?若应用的SDK最低版本和编译版本间的差异较大,由此带来的兼容性问题需要处理。原创 2022-09-14 10:24:20 · 6067 阅读 · 0 评论 -
【Android进阶】6、多 Activity 间用 intent、startActivityForResult、setResult 和 onActivityResult 通信
首先,在桌面启动器中点击GeoQuiz应用时,操作系统并没有启动应用,而只是启动了应用中的一个activity。确切地说,它启动了应用的launcher activity。这也是将ActivityManager设计成操作系统级的activity管理器来负责启动应用activity的原因之一。请求代码是先发送给子activity,然后再返回给父activity的整数值,由用户定义。虽然MainActivity只启动一种类型的子activity,但为应对未来的需求变化,现在就应设置请求代码常量。原创 2022-09-14 10:22:27 · 1090 阅读 · 0 评论 -
【Android进阶】5、Android 的断点调试、LogCat 与 Android Lint
展开this变量后可看到很多变量。它们是MainActivity类的Activity超类、Activity超类的超类(一直追溯到继承树顶端)的全部变量。现在,你只需要关注自己创建的变量。Android Lint(或Lint)是Android应用代码的静态分析器(static analyzer)。作为一个特殊程序,它能在不运行代码的情况下检查代码错误。要修改代码,必须先停止调试应用。注意,在调试时即使修正了代码,已加载调试器运行的代码还是旧代码,所以调试器给出的信息可能会误导你。下文是分析的结果, 例如。原创 2022-09-14 10:21:00 · 460 阅读 · 0 评论 -
【Android进阶】4、用 ViewModel 和 onSaveInstanceState 实现旋转屏幕时 UI 状态的保存和恢复
因为ViewModel生命周期 长于 Activity, 故只能短生命周期的Activity 引用 长周期的ViewModel, 而不能反向(否则当某对象引用了即将被销毁的对象时, 会阻止系统gc回收, 就会导致内存泄露)应用进程被销毁后,进程内存里存储的所有对象自然也就随之被销毁了。但是,停止的activity被“杀死”是很正常的事,例如,用户按了主屏幕键,然后播放视频或玩起游戏。每个应用都有自己的进程(更具体地讲,是一个Linux进程),其包含一个执行UI工作的单线程,以及保存对象的一小块内存。原创 2022-09-14 10:19:04 · 682 阅读 · 0 评论 -
【Android进阶】3、Activity 的生命周期
手机都有屏幕旋转功能, 目前,当我们正在回答第x题时,旋转手机后,又回到第一道题了, 这其实是和 Activity 的生命周期有关的,我们借此研究一下 Activity 的声明周期。设备配置(device configuration), 是一系列特征的组合来描述当前设备的状态, 这些特征包括: 屏幕方向, 屏幕像素密度, 屏幕尺寸, 键盘类型, 底座模式, 语言等。Activity 的子类可以在 activity 的生命周期状态发生关键性转换时,完成某些工作。生效了,确实放在了 UI 的右下角。原创 2022-09-14 10:16:51 · 360 阅读 · 0 评论 -
【Android进阶】1、Android Studio 项目搭建
本文通过 Android Studio 搭建项目,首先我们做一个下图一样的答题程序, 包括按钮, 文本, 通知, 和多。首先将 UI 布局设计为如下所示:中间的一行 TextView 是题目,其下的两个 Button 是用户的选择按钮。是典型的事件驱动程序, 可为某对象设置事件监听器。通过 LinearLayout 可实现上文的布局,编译为APK文件, 当在模拟器运行时还会以。内置了各种监听器, 可通过实现。文件夹下, 如字符串文件。类实例化布局文件中定义的每个。通常,字符串文件都放在。原创 2022-09-14 10:14:49 · 627 阅读 · 0 评论 -
【Android进阶】2、Android 的 MVC 设计模式
MVC是指Model, View和Controller, 其方便以类来思考问题, 且方便类的复用, 其架构如下。我们有为View设置尺寸的需求: 如文字大小text size, 外边距margin, 内边距padding。为了 Android 的 MVC 设计模式,我们通过实现如下的答题项目, 效果如下图,本项目代码也可在[github](https://github.com/datager/parkour/GeoQuiz)中clone 后即可在 Android Studio 中运行原创 2022-09-14 10:10:44 · 497 阅读 · 0 评论 -
【Android入门】10、天气预报 App 的接口、UI 实战
Android是一种可视化的技术, 在终端市场有70%占有率, 广泛应用在手机, 车载平板, 智能电视等领域, 其和web前端, ios开发一同属于大前端技术领域通过本文, 您可以了解`Android`技术全貌, 并用`kotlin`语言逐个实现个模块, 每个部分都有示例代码和效果图...原创 2022-08-15 18:30:42 · 1371 阅读 · 0 评论 -
【Android入门】9、用 Retrofit 和 OkHttp 请求网络、JetPack 组件:ViewModel、LifeCycle、LiveData、Room、WorkManager
是Jetpack最重要的组件, 为了解决传统的Activity需要处理逻辑/UI展示/网络回调的太耦合的问题, 其专门存放UI相关的数据。感知Activity的生命周期并不复杂,早在第3章的时候我们就学习过Activity完整的生命周期流。但问题在于,在一个Activity中去感知它的生命周期非常简单,而如果要在一个非Activity。在编写Android应用程序的时候,可能会经常遇到需要感知Activity生命周期的情况。Activity的生命周期,同时又不需要在Activity中编写大量的逻辑处理。原创 2022-09-25 20:49:03 · 786 阅读 · 0 评论 -
【Android入门】8、Service 后台线程、多线程、IntentService
AndroidStudio新建一个Service, 其会自动在manifest.xml中添加service的注册, 我们需重写onCreate, onStartCommand, onDestroy三个方法。当一个Activity和Service绑定了之后,就可以调用该Service里的Binder提供的方法了。的机制, 更方便的从子线程切换到主线程, 是Android官方通过封装Message机制的更好的API。为了防止手机变卡顿, Service随时都会都会。, 若真的需要后台执行, 可用。原创 2022-09-25 20:45:44 · 1091 阅读 · 0 评论 -
【Android入门】7、多媒体:用 NotificationChannel 和 NotificationManager 实现系统通知、播放音频和视频
为了防止通知太多淹没用户, 各APP可设置通知渠道, 如 Twitter可设置下列通知渠道, 用户可在手机按需订阅。Android的通知会在手机上方显示通知图标, 下拉状态栏也可看到通知的详尽内容.在此工程内, 我们新建一个NotificationActivity, 其布局如下。, 其用于在某合适的时机执行某动作, 可理解为延迟执行的。高级别通知样式如下, 会在其他APP上方弹出, 需慎用。入“assets”,目录就创建完成了, 如下图。点击按钮后, 下拉状态栏可见通知。类实现, 其API如下。原创 2022-09-25 20:42:43 · 1259 阅读 · 0 评论 -
【Android入门】6、ContentProvider:跨程序的数据共享:访问其他 App、被其他 App 访问
ContentProvider 的应用场景: 例如通讯录/媒体库共享给其他APP, 拿到了其他APP的数据, 就可以提供更好的内容, 有更好的用户体验。原创 2022-09-25 20:38:50 · 1348 阅读 · 0 评论 -
【Android入门】5、Broadcast 广播、Kotlin 的高阶函数、泛型、委托
广播用于在Android系统内实现通知,概念较为简单为了实现上述效果, 代码如下receiverreceiveractivities其中注册和反注册, 是写在onResume和onPause内, 而不是onCreate和onDestroy, 是因为我们希望只有栈顶的activity才可收到强制下线的广播, 其他非栈顶的activity不应该且没必要收此广播, 即当一个activity失去栈顶位置时自动取消的注册buttonbroadcast主activity原创 2022-09-25 20:32:04 · 549 阅读 · 0 评论 -
【Android入门】4、数据持久化:文件、SharedPreferences 和 Sqlite
目前有了Book表,若希望增加Category表, 则可添加如下代码, 多次调用onCreate(), 但只有第一次才会生效, 因为只有第一次才会建库BookStore.db, 后续若此库存在则不会再建库BookStore.db, 除非卸载app或手动删除BookStore.db文件。通过点击按钮, 会在/data/data/com.example.sharedpreferencestest/shared_prefs/data.xml中存放如下数据。点击load按钮, 即可加载数据, 在控制台打印如下。原创 2022-09-25 20:29:15 · 409 阅读 · 0 评论 -
【Android入门】3、UI 控件:TextView、Button、ImageView、AlertDialog 和 LinearLayout、RelativeView、ListView 布局
我们所用的所有控件都是直接或间接继承自View的,所用的所有布局都是直接或间接继承自ViewGroup的。View是Android中最基本的一种UI组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件,因此,我们使用的各种控件其实就是在View的基础上又添加了各自特有的功能。而ViewGroup则是一种特殊的View,它可以包含很多子View和子ViewGroup,是一个用于放置控件和布局的容器例如我们实现一个自定义顶部标题栏, 使可返回上一级, 新建一个layout/title.xml。原创 2022-09-25 20:25:50 · 481 阅读 · 0 评论 -
【Android入门】2、Activity 页面的生命周期、启动模式、用 Intent 启动 Activity、用 startActivityForResult 返回数据给 Activity
android 用 task 管理 activity, 一个 task 就是一组存放在栈里的activity集合当启动 activity 则入栈, 当 activity 销毁(按 back 键或调用 finish() 销毁)则出栈- onCreate: 第一次创建activity时初始化的操作, 如加载布局, 绑定事件- onStart: 当activity由可见变为不可见时- onResume: 当activity准备好和用户交互时(此时一定在栈顶且为运行状态)原创 2022-09-25 20:20:33 · 486 阅读 · 0 评论 -
【Android入门】1、Android 入门概念、Android Studio 环境搭建并运行首个 App
Android是一种可视化的技术, 在终端市场有70%占有率, 广泛应用在手机, 车载平板, 智能电视等领域, 其和web前端, ios开发一同属于大前端技术领域通过本文, 您可以了解Android技术全貌, 并用kotlin语言逐个实现个模块, 每个部分都有示例代码和效果图。原创 2022-09-25 20:14:07 · 1073 阅读 · 0 评论 -
【Android】AndroidStudio 快捷键、折行等必备设置
打开设置, 搜索back, 设置快捷键为ctrl + [搜索forward, 设置快捷键为ctrl + ]原创 2022-09-03 23:17:31 · 1585 阅读 · 0 评论 -
【Android】0、Android 开发从入门到实战超详细路线图
然后是进阶阶段,在入门阶段了解了 Android 基础知识后,再看《Android 权威编程指南》可以更细致的讲解各知识点,也会以实战方式巩固。可以阅读较新的书,如《Android Jetpack 应用指南》,学习较新版本的 Android 的最佳实践。然后入门阶段,推荐看《Android 第一行代码》书,跟着书可以较系统的掌握知识点,也可以上手实战。接下来就是实战,可以从一个小的需求出发,例如做一个直播 App,攻克各技术难点。原创 2022-09-03 01:05:48 · 1676 阅读 · 0 评论