![](https://img-blog.csdnimg.cn/20200804100343865.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Android
文章平均质量分 61
Android常见组件与开发小技巧
蒙同學
这个作者很懒,什么都没留下…
展开
-
设计一种需要登录后跳转到目标Activity的方案
前言在日常开发中,遇到需要登录后才能跳转的目标页面时,大多数写法如下:if(登录校验逻辑) { 已登录,跳转至目标页。} else { 未登录或登录过期时,跳转至登录页面。} 针对未登录或登录过期时,跳转到登录页面进行登录,登录完成后要么发送一条广播,要么借助一些主流的三方框架(如:RxJava, EventBus等)来通知登录状态,获取到登录状态后跳转到目标页面,这种写法看似简单,但写的多了,就变得冗余了,自定义一个RouteHelper来优化这种跳转流程。场景流程图定义原创 2021-11-12 22:00:00 · 567 阅读 · 0 评论 -
设计一个响应式网络请求
前言在日常开发中经常会涉及到网络请求,随着业务的复杂多变,对于请求库的功能及职责也要求越来越高,一个不错的请求库能使日常开发事半功倍。流程图RequestObservableRequestObserverRequestSubscriber添加依赖dependencies { // Retrofit implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.原创 2021-11-09 22:00:00 · 2669 阅读 · 0 评论 -
组件化Application共享方案
前言我们在日常开发中,随着项目功能越来越多,业务也越来越复杂,团队成员增多,普通的项目结构也就不适合团队协作,组件化后想要全局获取应用上下文interface IModuleInit { fun onCreate() {} fun attachBaseContext(base: Context) {} fun onLowMemory() {} fun onTrimMemory(level: Int) {} fun onTerminate() {}}abst原创 2021-03-10 17:29:27 · 600 阅读 · 0 评论 -
Fragment中响应onBackPressed事件
前言在单个Activity+多个Fragment架构设计中,通常会遇到点击手机物理按键返回上一层页面的场景,如果Activity中添加了Fragment,不管你加了几个,点击物理返回按钮时都会触发Activity的onBackPressed事件,直接返回到上一个Activity或者手机桌面,有时候往往需要Fragment能像Activity一样返回上一个Fragment即可,这样的需求就需要在Fragment中单独处理。定义扩展函数typealias OnBackPressedTypeAlias =原创 2021-01-23 13:03:09 · 1746 阅读 · 5 评论 -
获取Theme中Attr属性的Color值
前言在做多套主题切换时,个别View是在代码中创建的,切换不同主题时,无法直接获取到自定义的 attr 属性的 color 值,在网上看了大多数使用新建一个 TypedValue 对象,然后使用 context.theme.resolveAttribute 函数将color值复制到 TypedValue 对象中,通过 typedValue.data 的方式获取,但是这种仅仅局限于当前上下文环境下的 Theme 属性,切换其他 Theme 后就不会生效,翻看了下 ***Material***的包,发现源码原创 2021-01-22 19:25:43 · 1802 阅读 · 1 评论 -
自定义商品价格AmountTextView
前言在电商项目中,通常会遇到商品价格多样化的需求;如:显示±符号,货币符号,金额数字要使用千分位,小数位要四舍五入,货币符号与金额数字要大小不一样等需求,使用 TextView + Spanned 也可以实现预期效果,但是相对来说处理起来比较麻烦,要灵活多变,个人觉得还是自定义一个View比较方便。效果图自定义AmountTextViewAmountTextView 组合:±符号+货币符号+整数位+小数位使用DecimalFormat进行格式化及四舍五入计算提供 ***fun setCur原创 2021-01-19 15:10:04 · 364 阅读 · 0 评论 -
使用CameraX组件实现相机拍照
前言在Camera,Camera2之后Google的Jetpack项目新增了CameraX库,利用该库,可以更轻松地向应用添加相机功能。并且CameraX适用于大多数 Android 设备,并可向后兼容至 Android 5.0(API 级别 21)。相对Camera,Camera2而言,CameraX只要简单的几行代码就可以实现拍照。Gradle依赖dependencies { // ... // CameraX implementation 'androidx.camer原创 2020-11-30 18:45:00 · 1745 阅读 · 2 评论 -
Glide遇到DataBinding的花式用法
前言主流的图片加载框架越来越多,对应的配置也很麻烦,加载一张图片需要配置一堆参数才能达到需求,使用 Glide + DataBinding + Kotlin扩展简单的几个类,可以完成方便快速的统一进行配置。1.定义缓存配置项class DiskCacheOptions private constructor(builder: Builder){ val bitmapPoolSize: Float val memoryCacheSize: Float val diskCach原创 2020-11-24 11:58:13 · 3620 阅读 · 11 评论 -
多线程下获取随机数的小技巧
前言Random 实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一 seed 导致的性能下降。 Random 实例包括 java.util.Random 的实例或者 Math.random() 的方式。可以直接使用 ThreadLocalRandom 。1.RandomRandom 使用相同的 seed 创建了两个实例,并且对每个实例进行了相同的方法调用序列,则它们将生成并返回相同的数字序列。Tip:Random中的seed是一个Long类型的原子变量AtomicLong对象R原创 2020-08-27 14:24:23 · 1225 阅读 · 0 评论 -
Exoplayer2实现边播放边缓存
前言ExoPlayer是Google开源的一款Android应用程序级的媒体播放器。它提供了Android MediaPlayer API的替代方法,可以在本地和Internet上播放音频和视频。ExoPlayer支持Android MediaPlayer API当前不支持的功能,包括DASH和SmoothStreaming自适应播放。与MediaPlayer API不同,ExoPlayer易于自定义和扩展。这里主要使用 ExoPlayer + AndroidVideoCache 实现边播放边缓存。下面点原创 2020-07-31 20:29:51 · 8199 阅读 · 1 评论 -
使用Chrome DevTools调试WebView
chrome://inspect/#devices原创 2020-06-03 14:36:57 · 2361 阅读 · 0 评论 -
RecyclerView优雅的实现复杂列表
前言在RecyclerView实现多种Item类型列表时,有很多种实现方式,这里结合DataBinding+Lifecycles实现一种简单,方便,快捷并以数据驱动UI变化的MultiTypeAdapterDataBinding 以声明方式将可观察的数据绑定到界面元素Lifecycles 管理您的 Activity 和 Fragment 生命周期Tip: 对DataBinding和Lifecycles不熟悉的小伙伴可点击查看官方介绍。1. 定义一个基类MultiTypeBinder方便统一实原创 2020-05-09 21:59:41 · 1530 阅读 · 5 评论 -
kotlin与Java相互调用
1.在kotlin中调用Java方法Kotlin和Java是两种不同的语言,所以在互相调用的时候,会有一些特殊的语法。kotlin中对象属性默认就带有setter和getter方法,所以在kotlin中调用Java时直接变量名点属性就可获取到属性的setter和getter的一些操作。如下面的Java对象,在kotlin中也可以直接mAccount.setAccount(“秦川小将”);或者m...原创 2018-01-31 15:43:10 · 18606 阅读 · 2 评论 -
kotlin中的修饰符
类修饰符 修饰符 说明 final 不能被继承 open 可以被继承 abstract 抽象类 enum 枚举类 data 数据类 sealed 密封类 annotation 注解类Java的类和方法默认是open的,而kotlin中默认都是final的。如果创建一个类的子类,需要使用o...原创 2018-02-06 10:59:10 · 2431 阅读 · 0 评论 -
kotlin中Handler的定义以及使用
Handler在kotlin中定义以及使用方法:class MainActivity : AppCompatActivity() { // 静态常量 companion object { const val INDEX_KEY = "index" const val NAME_KEY = "NAME" const val F...原创 2018-02-26 11:56:46 · 13407 阅读 · 0 评论 -
kotlin中线程实现的两种方式
线程创建kotlin中创建线程与Java中创建线程一样,都是通过创建Thread对象或者实现Runnable接口来创建线程。创建Thread对象来创建线程// 创建Threadval mThread = CustomThread()// 调用 mThread.start()// ============================================...原创 2018-02-27 10:01:33 · 13652 阅读 · 1 评论 -
kotlin中属性的setter和getter
1.在Kotlin中,getter和setter是可选的,如果你没有在代码中创建它们,它是会默认自动生成。class Account { var name: String = "" var age: Int = 0 var balance: Double = 0.0}相当于class Account { var name: String = ...原创 2018-01-26 17:20:38 · 19956 阅读 · 0 评论 -
kotlin中的接口使用
1.接口Kotlin 中的接口与 Java 8 非常类似. 接口中可以包含抽象方法的声明, 也可以包含方法的实现. 接口与抽象类的区别在于, 接口不能存储状态数据. 接口可以有属性, 但这些属性必须是抽象的, 或者必须提供访问器的自定义实现。interface OnRefreshListener { fun onRefresh()}2.接口实现class V...原创 2018-01-26 17:28:40 · 2551 阅读 · 0 评论 -
kotlin中is,!is,as,as?运算符
1.is运算符和 !is 运算符kotlin中API提供的 is 运算符类似于Java中的 instanceof 关键字的用法。is 运算符可以检查对象是否与特定的类型兼容(兼容:此对象是该类型,或者派生类),同时也用来检查对象(变量)是否属于某数据类型(如Int、String、Boolean等)。 !is运算符是它的否定形式。val mAccount = "秦川小将"println...原创 2018-02-05 11:26:26 · 19781 阅读 · 3 评论 -
解决Fragment中onActivityResult()方法无响应问题
案例1针对在 Fragment 中调用 startActivityForResult(…) 接收 Activity 返回值,Fragment 中的 onActivityResult(…) 无响应问题。 解决思路如下:1.调用 getSupportFragmentManager() 方法,获取到当前 Activity 中的 Fragment 集合。2.遍历该集合,手动调用在当前...原创 2018-05-22 19:15:40 · 9440 阅读 · 1 评论 -
Android中Theme相关属性
状态栏,导航栏 属性 取值类型 描述 android:statusBarColor @color 设置系统状态栏颜色 android:navigationBarColor @color 设置系统导航栏的颜色 android:navigationBarDividerColor @color 在系统导航栏和应用程序内容之间显示指定细...原创 2018-09-13 18:37:03 · 2317 阅读 · 0 评论 -
Android商品详情页特效
商品详情页效果1.上下滑动改变状态栏背景色2.BottomSheetDialogFragment实现商品筛选弹框3.使用主题属性做兼容性适配布局点击查看Android中Theme相关属性点击下载Demo...原创 2018-09-14 16:31:06 · 1772 阅读 · 4 评论 -
RecyclerView滚动Item置顶
点击左边RecyclerView中的Item,使右边的RecyclerView的Item滚动并置顶。直接调用RecyclerView中的scrollToPosition(int position)方法,Item每次滚动,仅仅只会滚动到当前视图可见,并不会置顶。调用右边的 RecyclerView 的 LayoutManager 中的 scrollToPositionWithOffset(int...原创 2018-09-29 13:57:51 · 1957 阅读 · 0 评论 -
Android存储路径探索
在Android中访问SDCard的一些路径,用到Environment类,对Environment的一些学习记录。系统根目录,例:/systemstatic File getRootDirectory()返回用户数据目录,例:/datastatic File getDataDirectory()返回下载/缓存内容目录,例:/data/cachestatic File ...原创 2019-05-11 23:58:06 · 2695 阅读 · 0 评论 -
高精度计算BigDecimal,DecimalFormat
编码中通常遇到金额以及小数点精度计算,为避免精度丢失,将double类型转换为BigDecimal再进行相关计算,或者使用DecimalFormat进行转换。1.BigDecimal BigDecimal是Java提供的一个不变的、任意精度的有符号十进制数对象,继承自Number类。BigDecimal类提供了算术操作,操作规模,四舍五入,比较,哈希和格式转换。BigDe原创 2018-01-25 14:32:56 · 1104 阅读 · 0 评论 -
Kotlin中的基本类型(—)
1.Any根类型Kotlin 中所有类都有一个共同的超类 Any ,如果类声明时没有指定超类,则默认为 Any。Any在运行时,其类型自动映射成java.lang.Object。在Java中Object类是所有引用类型的父类。但是不包括基本类型:byte int long等,基本类型对应的包装类是引用类型,其父类是Object。而在Kotlin中,直接统一,所有类型都是引用类型,统一继承父类A...原创 2018-02-01 14:55:21 · 2713 阅读 · 1 评论 -
Kotlin中的基本类型(二)
1.数组类型Kotlin 中的数组通过 Array 类表达, 这个类拥有 get 和 set 函数(这些函数通过运算符重载转换为 [] 运算符), 此外还有 size 属性, 以及其他一些有用的成员函数:public class Array<T> { /** * Creates a new array with the specified [size], ...原创 2018-02-05 10:01:55 · 428 阅读 · 0 评论 -
Android 7.0 FileProvider适配
Android7.0做了一些权限更改,为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问。此设置可防止私有文件的原数据泄漏,同事Android7.0如果传递 file:// URI 会触发 FileUriExposedException 异常。适配Android7.0 FileProvider的步骤如下:AndroidManifest.xml清单文件的修...原创 2018-02-27 11:22:50 · 641 阅读 · 0 评论 -
CardView使用与介绍
1.在Android Studio工程中build.gradle中配置如下:dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') // 引用android.support.v7.CardView包 compile 'com.android.support:cardview-v7:23.+'...原创 2018-02-27 10:19:47 · 485 阅读 · 0 评论 -
Android代码混淆与反编译
1.混淆的目的用于保护APP不被破解和逆向分析。2.混淆的意义proguard通过移除没有用到的代码以及通过特定规则重命名类、变量、方法来压缩、优化、混淆你的代码。这样做可以让你的apk更小,更难被逆向分析。由于可以提高被逆向分析的难度,对相关功能安全敏感的应用使用它是十分必要的。混淆本质上是不能阻止反编译的,只能增加反编译以后阅读理解的难度罢了。3.混淆在代码优化方面原创 2018-02-05 13:22:23 · 911 阅读 · 0 评论 -
Gson解析服务端返回的多种类型的JSON
遇到几种Json类型,使用Gson通过自定义解析器解析一下几种类型的返回数据。JSON示例返回Json中data为空{ "data": "", "code": 1, "message": "请求失败"}返回Json中data值为null{ "data": null, "code": 1, &q原创 2018-02-09 13:48:33 · 3495 阅读 · 4 评论 -
自定义圆形经验统计View
自定义View是我们作为一个“猿”必要掌握的招数,下面介绍下招数。1.首先在onMeasure方法中量测量View和它的内容来确定测量的宽度和高度。 onMeasure(int widthMeasureSpec, int heightMeasureSpec) @Override protected void onMeasure(int widthMeasur原创 2017-04-13 13:05:45 · 290 阅读 · 0 评论 -
DialogFragment更优雅的使用
DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。1.官方这样介绍的: A fragment that displays a dialog window, floating on top of its activity’s window. This fragment contains原创 2018-01-25 14:30:37 · 3374 阅读 · 2 评论 -
WebView与JS代码互相调用
Android手机中内置了一款高性能 webkit 内核浏览器,在 SDK 中封装为一个叫做 WebView 组件。使用该组件来加载JavaScript页面。初始设置 // 支持JavaScript接口,WebViewInterface为自定义接口类 mWebView.addJavascriptInterface(new WebViewInterface(this), "...原创 2018-01-25 14:27:55 · 332 阅读 · 0 评论 -
自定义TextView显示.ttf文件中的字符
利用Typeface显示.ttf文件中的字符在TextView上面。效果图:代码如下: /** * 作者:秦川小将 * 描述:TypefaceTextView */ public class TypefaceTextView extends TextView { public TypefaceTextView(Context co原创 2017-04-13 13:01:54 · 544 阅读 · 0 评论 -
微信Tinker在Android中集成以及使用
Tinker项目(点击进入) Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码。.so库以及资源库,让应用能够在不需要重复安装的情况下实现更新,当然也可以使用Tinker来更新你的插件。在接入Tinker之前我们先对Tinker的结构了解一下Tinker主要包括一下几个部分: 1.gradle编译插件:tinker-patch-gradle-plugin。 2原创 2017-04-10 13:44:00 · 574 阅读 · 1 评论 -
Android 在Gradle中优雅的配置构建环境
Coding时经常会用到一些support包或其它的依赖包等,有时候也创建一些Library,这些support包和依赖包,Library中的包如何更好的配置版本呢?如果需要修改版本,怎么办?每次都手动修改,修改完之后,在 Sync Now 接着Gradle再编译半天?其实用不着那么麻烦就能很好的管理项目中的版本。首先在工程最外层的gradle.properties中如下定义:# compileSd原创 2017-04-10 13:41:19 · 397 阅读 · 0 评论 -
Android Studio快捷键
使用Android Studio开发项目有些时间了,说实在的比Eclipse爽很多。下面介绍一些Android Studio的快捷键。1.常用快捷键 描述 快捷键 保存全部 Ctrl + S 同步 Ctrl + Alt + Y 最大化/最小化编辑器内容编辑窗口 Ctrl + Shift + F12 添加到收藏夹 Alt + Shift + F 检查与当前配置原创 2017-04-10 13:32:55 · 599 阅读 · 0 评论 -
EventBus的使用以及消息处理
这篇帖子主要针对EventBus做一个简单的介绍使用以及遇到的问题处理。首先EventBus是什么?EventBus是一个消息总线,以观察者模式实现发布者/订阅者模式进行松散耦合的Android开源库。使 Widget,Activity,Fragment,Service以及Thread之间能更好的通信。参考文献EventBus官网地址 EventBus githu...原创 2018-02-27 11:25:39 · 1677 阅读 · 0 评论 -
Android沉浸式状态栏适配
1.自定义ToolbarToolbar虽然也提供了setTitle()等一些相应的方法,但都不是自己想要的样式。这里先创建一个layout用作Toolbar内容视图。Toolbar内容视图layout_common_toolbar.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:a...原创 2018-02-27 11:40:00 · 714 阅读 · 0 评论