Google N年前的Plaid重构了!学习笔记
recyclerview的android:clipToPadding="false",可以让内容滑到padding所占用的空间。
AS里可以直接将svg和psd转成矢量图来用的,这些图是不用按照分辨率提供不同的图了,有些系统图标也挺好用的~
应用启动的时候,根据有没有连接网络,会有一些不同的逻辑,所以在Activity的onCreate中有这么一段
1234567891011connectivityChecker?.apply { lifecycle.addObserver(this)//增加对UI生命周期的监听 // 这是个LiveData,当发生变化的时候,走自己的业务逻辑 connectedStatus.observe(this@HomeActivity, Observer<Boolean> { if (it) { handleNetworkConnected() } else { handleNoNet ...
kotlin协程在android的应用
可以让View层继承CoroutineScope by MainScope,就可以直接使用launch调用协程1234567abstract class BaseFragment:Fragment() ,CoroutineScope by MainScope(){ fun xxx(){ launch{ //...业务逻辑,默认在主线程执行 } } }
如果使用了ViewModle的话,可以在vm内直接使用viewModelScope.launch { }开启协程,也是在主线程内执行。
那么协程是怎么协的呢,举个栗子,retrofit网络请求,可以这样(注意这是举个栗子,实际开发用retrofit一般不会这么做,返回要么是Call,要么是Response,要么是Rxjava的Observable,否则服务端给个响应码404就异常了,捕获异常也只能拿到异常信息 ,拿不到errorBody中的信息)123456789101112131 ...
Android仿ios锁屏的验证小滑块
xml中
123456<androidx.appcompat.widget.AppCompatSeekBar android:layout_marginLeft="40dp" android:layout_marginRight="40dp" android:id="@+id/seekbar" android:layout_width="match_parent" android:layout_height="50dp" />
代码中
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 val dp25 = SizeUtils.dp2px(25F) // 画背景,圆角为宽度一半,画出矩形 ...
INSTALL_FAILED_UID_CHANGED
错误:安装出现INSTALL_FAILED_UID_CHANGED
原因:设备已root,清单配置了系统应用,签名也是额外用系统签名打包的,在AndroidManifest.xml中设置了android:sharedUserId="android.uid.system,而打包时忘了添加上。导致的UID错误不同从而安装失败。
Kotlin使用Gson、Moshi、KotlinSerialization转换json的区别
简介:Gson是google出的,Moshi是square出的,KotlinSerializatin(以下简称KS)是kotlin官方的。
测试用数据类
123456@JsonClass(generateAdapter = true) //这个注解是moshi用@Serializable //这个注解KS用data class User( val age :Int=11, val name :String= "lucy")
测试代码
12345678910111213141516171819202122// Moshitry { val moshi = Moshi.Builder().build() val user1 = moshi.adapter(User::class.java).fromJson(json) Log.d("moshi",user1.toString())} catch (e: Exception) { ...
ObjectBox 数据刷新无效问题
实际项目中发现没有自动刷新,于是写了个小demo测试了下,
一开始是这样,tv是用来测试自动刷新的TextView,tv2是手动显示user.age的,用来对比。
123456789101112131415161718ObjectBox.getUserBox().query().build() .subscribe() .on(AndroidScheduler.mainThread()) .observer { tv.text = it.firstOrNull()?.age?.toString() }btn_modify.setOnClickListener { val singleUser = ObjectBox.getUserBox().all.firstOrNull() //数据库空的,就随便插一条数据 if (singleUser==null) { ...
首页Activity重复启动问题
问题:Activity有很多种启动方式,app启动,不同app互相调,安装完点打开、点击桌面图标等等。当activity的launchIntent中的flag不同的时候,就会创建实例,从而导致重复的问题。用户比较容易感知的就是安装完点打开,然后点击home,再点击桌面,此时会出现情况如下:
123456789101112override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val myPid = Process.myPid() LogUtils.d( """ isTaskRoot:${isTaskRoot} pid:$myPid activityList:${ActivityUtils.getActivityList()} ...
关于kotlin gson序列化时出现null的一些注意点
现在前后端基本都用json来传输数据,kotlin因为有空校验比如这个类:
1234567data class XXXDataBean( var code:Int = 0, var data: DataBean = DataBean()) { class DataBean { }}
在kotlin中定义的都是非空,可是如果给的json是这样:
1234{ "code":1, "data":null}
在Gson().fromJson(json,XXXDataBean::class.java)拿到的对象中,data会为空。如果json不给data的话,那么data依然是初始化时的那个DataBean()
5.1 更新发现一个新的问题
数据类:
1234data class User( var age :Int, var name :String= "lucy")
在AndroidStudio中点击Tool ...
java.lang.UnsatisfiedLinkError:找不到so等等的排查经过
问题发生:本来数据库用的room,发现greendao作者写了个objectbox,就导入项目玩玩,结果发生了上述问题。
排查:
首先检查安装文件里有没有这个so文件,adb shell 进入设备,在data/data/包名/lib下果然有一些其他的so,但是没有报错的那个so。好的,问题发现。
既然没有安装,那么打包有没有出问题呢?找到apk文件,打开,在lib中有arm、armv7、armv8等。报错的so在arm里有,在armv7、armv8里都没有。OK,问题定位了。
设备是armv7的,之前用的数据库框架room是google对sqlite的一些封装,没有引入so,打包后只有arm,兼容几乎所有android设备,故没有报错。引入objectbox后,作者认为arm已过时没有支持,而且也不是我手动引入的,是在build.gradle里通过插件引入的,也没有感知到这个问题。所以打包后有arm、armv7、armv8等,而设备是v7的,在安装的时候就只将armv7安装了进去,导致了报错。
解决:在module的build.gradle下对ndk支持限定只支持armv7
12 ...
Android端信号强度监听api23.md
onSignalStrengthChanged()已经过期,但是监听PhoneStateListener.LISTEN_SIGNAL_STRENGTHS的话。如果使用signalStrength.level()又会提示需要api23。其实getLevel()方法并不是api23新加的,只是之前是hide方法。如下所示,用反射拿出来即可。同学们也可自行加入版本判断。
12345678910111213val service1 = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManagerservice1.listen(object:PhoneStateListener(){ override fun onSignalStrengthsChanged(signalStrength: SignalStrength) { super.onSignalStrengthsChanged(signalStrength) val javaClass = signalStrength ...