Android
Android
碧云天丶
这个作者很懒,什么都没留下…
展开
-
解决Pixel手机时间不能自动同步
Android原创 2022-10-15 19:42:06 · 6053 阅读 · 2 评论 -
AabResGuard添加依赖总结
aab 混淆原创 2022-07-24 16:02:35 · 1378 阅读 · 0 评论 -
解决 The emulator process for AVD was killed
解决 “The emulator process for AVD was killed”最近我创建一个新的模拟器, Android 11版本, 启动时候发现提示"The emulator process for AVD was killed".我搜了些中文博客, 写的各种设置, 后来在Google上搜索到是因为Android 模拟器版本太低了导致的, 在Studio种更新下Android Emulator就好了.原文链接...原创 2021-03-22 11:26:07 · 1234 阅读 · 0 评论 -
Kotlin Android缓存库CoroutinesCache
RxJava+Retrofit如果想做缓存以前会用RxCache(停止维护). 迁移到Kotlin后,使用Coroutines+Retrofit请求网络想做缓存的话貌似资料还不是不多.CoroutinesCache 是用来做Coroutines+Retrofit缓存的,这个库Readme有点老,下面记录的是我使用的时候踩坑的笔记.依赖implementation "com.github.diefferson:CoroutinesCache:0.3.0"使用private val co.原创 2020-12-16 18:31:57 · 681 阅读 · 1 评论 -
使用Kotlin协程Channel做一个定时器
// 使用通道创建定时操作,和Go协程一样的.lifecycleScope.launchWhenResumed { // 1.创建通道 val channel = Channel<Int>() // 2.向通道发送数据 launch(Dispatchers.IO) { for (i in 1..100) { delay(150) // 延时0.15秒发送 channel.send(i)原创 2020-12-01 11:47:42 · 5671 阅读 · 0 评论 -
Android BottomNavigationView 添加消息提示(二)
这篇文章中使用的旧版本BottomNavigationView如何设置徽章material-components-android简介依赖implementation 'com.google.android.material:material:1.3.0-alpha03'android:theme="@style/AppTheme"必须使用Theme.MaterialComponents.xxx主题<style name="AppTheme" parent="Theme.Mate.原创 2020-11-23 17:20:55 · 335 阅读 · 0 评论 -
Android DataBinding 简单封装
以下代码来源JDataBinding作者微信公众号:ByteCodeActivity里封装DataBindingprotected inline fun <reified T : ViewDataBinding> binding( @LayoutRes resId: Int): Lazy<T> = lazy { DataBindingUtil.setContentView<T>(this, resId) }使用private val mB.原创 2020-11-19 16:56:07 · 903 阅读 · 0 评论 -
Jetpack App Startup学习笔记
好文章这个笔记主要是对这篇文章的理解总结.PokemonGo里面代码用的是这个开源项目, 这个作者人很热情.总结某个库使用了ContentProvider来进行初始化,那这个库最好接入App Startup,这样可以让使用了这个库的APP降低启动耗时.一般做APP开发很少能用到App Startup,如果考虑到架构可以将原来Application中初始化的代码移动到App Startup中单独执行,这样可以让代码结构更好.一些库设计者会使用ContentProvider来初始化库, 这样做.原创 2020-11-17 17:44:25 · 195 阅读 · 0 评论 -
Android ViewPager2导致ScrollView自动滚动到顶部问题
描述ViewPager2+Fragment结构, Fragment的布局ScrollView里有一个Banner轮播图控件.当ScrollView顶部滑出屏幕, 轮播图切换的时候ScrollView顶部就回到0位置了.解决方法貌似没有很好的解决方法, 很多Banner库在这个结构中都会造成ScrollView自动滑动的问题出现.把ViewPager2换成ViewPager这个问题就消失了....原创 2020-11-13 11:57:35 · 1215 阅读 · 0 评论 -
Android TextInputEditText getBoundsOnScreen()报错
报错日志Process: loanchamp.com.loanchamp.plus, PID: 3104java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.getBoundsOnScreen(android.graphics.Rect)' on a null object reference at android.app.assist.AssistStructure$.原创 2020-11-09 18:22:36 · 353 阅读 · 0 评论 -
Android 用Java开发的自定义控件引入到Kotlin项目中的Bug
BUG1环境: Android Studio 4.0Bug描述Java写的自定义控件,每次改自定义控件后都会加到jcenter里,正式项目再从jcenter上拉aar包依赖, 然后缓存里大概有20多个版本aar文件.一次改了自定义控件布局文件后, 同样的操作, Kotlin项目打包用的布局结果依旧是老布局,但是代码是新版本代码,所以就找不到控件id.试过invalidate,clean等操作无效.但相同的依赖方法用在Java项目里面一点问题都没有.解决发现把Studio里面的缓存的arr文件原创 2020-08-31 16:04:47 · 384 阅读 · 0 评论 -
Android ScrollView滚动到指定子View中的子View
ScrollView中一般嵌套一个LinearLayout,当想用代码操作ScrollView滚到到指定的子View一般操作为ScrollView.scrollTo(0,View.getTop()),但是有没有遇到这种方式无效的时候呢?View.getTop()是获取该View相对于父容器的高度,比如ScrollView包含ALinearLayout,然后ALinearLayout中包含BLinearLayout和CLinearLayout,TextView控件为CLinearLayout中子控件..原创 2020-08-31 15:54:49 · 2156 阅读 · 0 评论 -
华为真机调试崩溃日志闪过问题
设置AP LOG为打开适用于华为荣耀6P这类老型号手机拨号界面输入*#*#2846579#*#*进入工程菜单->后台设置->AP LOG设置->打开Logcat选择show only selected application设置Logcat适用于华为荣耀9这类手机不要选择show only selected application,选择No Filters....原创 2020-08-31 15:37:52 · 821 阅读 · 0 评论 -
Android Kotlin KaptExecution错误集合
问题描述:在Module级别build.gradle下引入了apply plugin: 'kotlin-kapt',构建时出现下面的报错提示.public abstract class BaseStateActivity<T extends androidx.databinding.ViewDataBinding, E extends xxxx.BaseVM> extends xxxxx.BaseVMActivity<T> implements xxxxx.IBindVm&l.原创 2020-08-31 15:32:28 · 11618 阅读 · 0 评论 -
Android release版本java.lang.NoSuchMethodError XmlResourceParser报错
来源APP release包打开报错:java.lang.NoSuchMethodError: No interface method a()Ljava/lang/String; in class Landroid/content/res/XmlResourceParser; or its super classes (declaration of 'android.content.res.XmlResourceParser' appears in /system/framework/framewo.原创 2020-08-31 15:30:07 · 516 阅读 · 0 评论 -
WebView使用Kotlin时异常IllegalArgumentException
异常出现在为WebView设置监听时候.代码mDataBinding.wb.setListener(this, object : AdvancedWebView.Listener { override fun onPageStarted( url: String, favicon: Bitmap ) { } override fun onPageFinished(url: String) { } override f.原创 2020-08-31 15:29:01 · 300 阅读 · 0 评论 -
Android BottomNavigationView添加消息提示(一)
来源首先要写一个徽章布局notifications_badge.xml,我页面做了适配所以用的pt单位,也可以替换为dp,看项目情况.<merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:id="@+id/notifications_badge" android:layout_width="wrap_content" .原创 2020-08-31 15:25:59 · 571 阅读 · 0 评论 -
AndroidUtilCode AdaptScreenUtils屏幕适配使用笔记及简单分析
头条适配原理Android 屏幕适配终结者一种粗暴快速的Android全屏幕适配方案屏幕适配原理简单说下尺寸单位介绍dpi:屏幕密度,屏幕上每英寸上有多少像素点.屏幕对角线上的像素点总数除以屏幕对角线长度得到.dip:也就是最常用的dp单位,屏幕上每英寸有160个点,每个点如果代表1像素,那么1dp就等于1像素.- 问题来了,假如屏幕上每英寸有320个像素,屏幕宽是1080像素,此时该屏幕宽是多少dp?1. 屏幕每英寸320像素,如果用160个点去覆盖这些像素,每个点可以代表2个像.原创 2020-07-12 23:12:02 · 2064 阅读 · 0 评论 -
(三) Jetpack LiveData添加Observer立即调用onChanged方法流程
向LiveData中添加Observer,Observer.onChanged()为何被立即调用?调用LiveData.observe(owner,observer)public abstract class LiveData<T> { @MainThread public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) { .原创 2020-07-12 23:11:25 · 1685 阅读 · 3 评论 -
(二) Jetpack LiveData 源码分析
参考代码示例class MyViewModel : ViewModel() { val myLiveData: MutableLiveData<Int> by lazy { MutableLiveData<Int>().apply { // liveData 中初始赋值为0 value = 0 } }}// 使用viewModels需要依赖 implementation "an.原创 2020-07-05 20:23:07 · 200 阅读 · 0 评论 -
(一) Jetpack Lifecycle 源码分析
文章一 文章二 文章三 文章四 文章五 文章六 文章七依赖implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'kapt 'androidx.lifecycle:lifecycle-compiler:2.2.0'示例代码生命周期观察者class MyLifecycleObserver : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_CREA.原创 2020-07-05 20:22:39 · 268 阅读 · 0 评论 -
Android 8.0 启动图标适配
参考和UI设计师商量下,将之前的logo分为前景与背景两张图.之前的logo图如下:现在需要将上图分离为前景与背景图如下: 鼠标焦点放在src目录上,按下Windows:Ctrl+Shift+A 或者 Mac:command+shft+A 快捷键,输入Image Asset.打开Configure Image Asset窗口,如下:配置时候,Preview中有个圆圈表示的是范围,在这个范围内展示logo的主要内容,范围之外的到时候在手机上展示的时候会被自动裁剪掉.Previe.原创 2020-07-05 20:21:29 · 889 阅读 · 0 评论 -
Toutiao 项目源码阅读
项目地址一款第三方今日头条客户端, MVP + RxJava + Retrofit架构标准的MVP架构IBasePresenter层每个P层都有刷新界面以及显示网络错误需求public interface IBasePresenter { void doRefresh(); void doShowNetError();}IBaseView层每个V层都有展示状态页,设置Presenter,以及解除RxJava订阅防止内存泄漏的接口.public interface I.原创 2020-06-25 14:13:10 · 266 阅读 · 0 评论 -
Android 9.0刘海屏适配
参考文章Demo地址全屏状态下全屏的状态中,状态栏是不存在的,系统默认DecorView布局不会延申到刘海区域.设置全屏// 去除标题requestWindowFeature(Window.FEATURE_NO_TITLE);// WindowManager.LayoutParams.FLAG_FULLSCREEN: 让window进行全屏显示getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowMa.原创 2020-06-21 20:12:05 · 921 阅读 · 0 评论 -
(十二) Dagger2 @IntoMap案例分析
代码示例// 父类abstract class Animal { // 抽象方法 abstract void sleep();}// 子类class Tiger extends Animal { @Inject public Tiger() { } @Override public void sleep() { System.out.println("Tiger sleeping"); }}// 子类class原创 2020-06-21 20:11:52 · 1055 阅读 · 0 评论 -
(十一) Dagger2 @IntoSet案例分析
代码示例// 父类abstract class Animal { // 抽象方法 abstract void sleep();}// 子类class Tiger extends Animal { @Override public void sleep() { System.out.println("Tiger sleeping"); }}// 子类class Cat extends Animal { @Override原创 2020-06-21 20:11:40 · 452 阅读 · 0 评论 -
(十) Dagger2 懒加载案例分析
代码示例class Tiger { public void sleep() { System.out.println("Tiger sleeping"); }}@Moduleclass ZooModule { @Provides public Tiger providerTiger() { return new Tiger(); }}@Component(modules = {ZooModule.class})interf原创 2020-06-21 20:11:22 · 336 阅读 · 0 评论 -
(九) Dagger2 @Qualifier案例分析
代码示例class Tiger { String name; public Tiger(String name) { this.name = name; } public Tiger() { } public void sleep() { System.out.println("Tiger sleeping"); }}// 自定义Qualifier注解@Qualifierpublic @interface Ti原创 2020-06-21 13:14:56 · 231 阅读 · 0 评论 -
(八) Dagger2 @Singleton案例分析
代码示例class Tiger { public void sleep() { System.out.println("Tiger sleeping"); }}@Moduleclass ZooModule { @Singleton // 注意这里 @Provides public Tiger providerTiger() { return new Tiger(); }}@Singleton // 注意这里@Com原创 2020-06-21 13:14:14 · 367 阅读 · 0 评论 -
(七) Dagger2 Component间的依赖
代码示例假如PlaygroundComponent注射器需要ZooComponent提供对象.class Tiger { public void sleep() { System.out.println("Tiger sleeping"); }}// 为注射器提供工厂类// @Module: 表示Dagger2可以将该类当作对象工厂.@Moduleclass ZooModule { // @Provides: 表示Dagger2可以调用providerT原创 2020-06-21 13:13:29 · 295 阅读 · 0 评论 -
(六) Dagger2 @Module分析四
代码示例class Food {}class Tiger { // 假如老虎需要食物 Food food; public Tiger(Food food) { this.food = food; } public void sleep() { System.out.println("Tiger sleeping"); }}// 为注射器提供工厂类// @Module: 表示Dagger2可以将该类当作对象工厂.@原创 2020-06-21 13:12:57 · 186 阅读 · 0 评论 -
(五) Dagger2 @Module分析三
代码示例class Food {}class Tiger { // 假如老虎需要食物 Food food; public Tiger(Food food) { this.food = food; } public void sleep() { System.out.println("Tiger sleeping"); }}// 为注射器提供工厂类@Moduleclass FoodModule { @Prov原创 2020-06-21 13:12:08 · 286 阅读 · 0 评论 -
(四) Dagger2 @Module分析二
代码示例class Food { // @Inject:该注解用于类构造方法上表示该类可以被Dagger2实例化对象后供注射器使用. @Inject public Food() { }}class Tiger { // 假如老虎需要食物 Food food; public Tiger(Food food) { this.food = food; } public void sleep() { Sys原创 2020-06-21 13:11:35 · 213 阅读 · 0 评论 -
(三) Dagger2 @Module分析一
代码示例class Tiger { public void sleep() { System.out.println("Tiger sleeping"); }}// 为注射器提供工厂类// @Module: 表示Dagger2可以将该类当作对象工厂.@Moduleclass ZooModule { // @Provides: 表示Dagger2可以调用providerTiger()方法为注射器提供对象. @Provides public T原创 2020-06-21 13:11:21 · 215 阅读 · 0 评论 -
(二) Dagger2 @Inject分析二
代码示例class Food { // @Inject:该注解用于类构造方法上表示该类可以被Dagger2实例化对象后供注射器使用. @Inject public Food() { }}class Tiger { // 假如老虎需要食物 Food food; // @Inject:该注解用于类构造方法上表示该类可以被Dagger2实例化对象后供注射器使用. @Inject public Tiger(Food food) {原创 2020-06-21 13:10:05 · 262 阅读 · 0 评论 -
(一) Dagger2 @Inject分析一
代码示例// 对象提供方class Tiger { // @Inject:该注解用于类构造方法上表示该类可以被Dagger2实例化对象后供注射器使用. @Inject public Tiger() { } public void sleep() { System.out.println("Tiger sleeping"); }}// 对象使用者public class Zoo { // @Inject: 该注解用于成员变量原创 2020-06-21 13:09:27 · 213 阅读 · 0 评论 -
Android StatusBarUtil源码阅读
StatusBarUtil地址setColor()设置状态栏颜色从设置状态栏颜色方法开始看.public class StatusBarUtil { /** * 设置状态栏颜色 * * @param activity 需要设置的 activity * @param color 状态栏颜色值 */ public static void setColor(Activity activity, @ColorInt int color.原创 2020-06-21 13:07:30 · 303 阅读 · 0 评论 -
Android 沉浸式状态栏归纳
参考文章沉浸式状态栏就是将标题栏颜色与状态栏颜色设置为同一种颜色,Android不同的版本设置沉浸式方法也不大一样.4.4时设置方法代码设置或者主题设置activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);主题设置,在values-v19文件夹下<style name="MDTheme" parent="Theme.Design.Light.NoActionBar">.原创 2020-06-20 17:51:52 · 382 阅读 · 0 评论 -
Retrofit 源码阅读
当前版本2.9.0简单示例添加依赖implementation 'com.squareup.retrofit2:retrofit:2.9.0'implementation 'com.squareup.retrofit2:converter-gson:2.9.0'implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'代码interface GitHubService { @GET("users/{user}.原创 2020-06-08 18:35:54 · 286 阅读 · 0 评论 -
Java 泛型通配符(泛型上限下限)
Demo泛型通配符<?>泛型继承list1与list2之间根本没有关系,它们是相互独立的.ArrayList<Object> list1 = null;ArrayList<String> list2 = null;list2 = list1; 编译不通过list1 = list2; 编译不通过<?>是所有泛型的父类ArrayList类型与ArrayList没有半毛钱关系ArrayList<?>类型可以用来接收.原创 2020-06-07 21:10:18 · 747 阅读 · 0 评论