Android 开发所遇问题
1. 环境问题
2018-7-25
问题:AVD启动不了 —— 报x86需要加速程序错误 —— 在SDK管理器中重新安装这个组件出错 —— 报Hyper-V Hyper-Vx冲突
解决:win10 —— 控制面板 》程序与功能 》启用或关闭Windows功能 —— 取消选择Hyper-V
2. AndroidStudio问题
2020-9-28
问题:应用崩溃后重启,看不到日志
解决:在Logcat选择崩溃的包名查看日志,xxx.xxx.xxx 【DEAD】
2018-9-24
问题:Kotlin not configed
解决:项目七转八转,一顿瞎操作,最后把kotlin的版本都弄错了,在项目build.gradle中把kotlin版本改回与gradle相对应版本(会有提示)。
2018-9-24
问题:Android Studio 抽风, 不停报错:Stub index points to a file without PSI: com.intellij.openapi.fileTypes ... ...
解决:File》Invalidate Cashes / Restart
2018-7-31
问题:真机测试时,安装应用失败,卸载了之前版本也没有
解决:Android studio —— File》Settings》Build》Instant Run —— 取消选择Enable Instant Run ...
后续(2018.9.21):发现 Instant Run 还是挺有用的,打开此功能,将 app》build》intermediates 文件夹删掉再编译运行,可以用了
3. 代码问题
2020-12-16
问题:RecyclerView的报错 Inconsistency detected. Invalid view holder adapter positionViewHolder
原因:数据list内容改变后,没有及时通知列表内容变化。要保证先改变list,后通知,并且在同一线程顺序执行。
2020-12-14
问题:AlarmManager无法传递PendingIntent中的Parcelable类型Extra。设置了Parcelable的extra之后,不仅这个数据丢失,连同一起设置的其他extra一起丢失。
原因:网络上的解释是系统如果需要修改Intent时,需要重建intent的extra,而系统没有自定义的类,这个步骤会崩溃,闹钟触发时只会得到空数据。
解决:Anroid N之前还可能用。之后只能设置基本类型数据,或者将Parcelable转为基本类型传递。
2020-5-4
问题: View先从父View中移除再添加,依然报已有父View的错误
原因:View在从父View中移除时,有Translation动画,还没有真正从父View中移除。看源码好像是低版本的BUG,当前出现问题的系统 Android 7.0
2020-4-5
问题:GridLayout 动态添加控件不显示,Android 6.0以上系统测试正常,向下兼容时出现。
原因:引用的是 android.widget.GridLayout
解决:添加依赖:implementation"androidx.gridlayout:gridlayout:1.0.0",并引用 androidx.gridlayout.widget.GridLayout。看来android.widget.GridLayout已经被抛弃了。但竟然可以在高版本使用,F**K。
2019-4-3
问题:ViewGroup启用LayoutTransition时,动态添加这个ViewGroup自己却有动画
原因:本以为 LayoutTransition只作用于ViewGroup的子View,但是LayoutTransition类源码runChangeTransition函数显示:如果 mAnimateParentHierarchy 为true,启用ViewGroup的父ViewGroup的动画,作用于当前ViewGroup。
解决:transition.setAnimateParentHierarchy(false)
2019-2-13
问题:RecyclerView 滚动之后 item 点击事件失效,表现为点击两次或过一会儿点击生效
原因:RecyclerView 嵌套在CoordinatorLayout中产生此问题,RecyclerView 滚动表面上结束了,内容还处于Fling状态,不能响应点击。RecyclerView 28.0.0 版本在修复旧版本问题的时候引入此新 BUG。
解决:禁止直接嵌套。
2018-9-18
问题:自定义TextView初始化时 SingleLine 属性与 Gravity.Center 混用,导致不绘制
解决:这是TextView的一个Bug,没办法,估计Google也不会注意到这个问题上来。
2018-8-10
问题:自定义属性 obtainStyledAttributes 死活找不到 R.styleable.xxx 但是能找到 R.styleable.xxx_xxx
解决:错误提示垃圾了,其实是 attrs.xml 出现了问题。我的问题:
1、有重复 attr 属性名称,将重复的属性名称移动到 declare-styleable 外面,引用时只包含名称。
2、attr 名称有一个是 “new” 系统不接受,也不提示错误 f*******k
2018-8-2
问题: ViewPager使用,PagerAdapter.notifyDataSetChanged()不更新数据。
过程:网上回答比较多的是 getItemPosition return POSITION_NONE,还有其他使用 FragmentPagerAdapter,FragmentStatePagerAdapter的,复写了其他方法的,统统尝试了在我的工况下没有效果。
结果:stackoverflow 上这个问题持续问了六年,不断有人回答,讨论,结果仍然不够明朗。
解决:其实只需要给 ViewPager 重新设置一次更新数据了的 PagerAdapter 即可。这并没有损失多少性能,重新设置 adpater 与 return POSITION_NONE 是一个原理,重新生成了2~3个View而已。
2018-7-31
问题:java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.ViewGroup.transformMatrixToGlobal(android.graphics.Matrix)' on a null object reference
工况:Activity A 中的 RecyclerView 中的 item 与 Activity B 中的一个View共享,使用共享元素动画在二者间跳转, 为了动画更柔和没有闪烁,从 B 返回 A 时先通过 BroadcastReceiver 把数据返回来, 更新了 A 中 item,使用了 RecyclerView 的 notifyItemChanged(position:Int),共享元素动画结束时报错。
原因:经测试,不同系统版本,不同 RecyclerView 版本(27.1.1 与 26.1.0)表现不一样,以上问题发生在使用 notifyItemChanged(position:int) 会重新调用 onCreateViewHolder 即使 Item 还在可视区,这个调用导致共享元素发生变化,不再是同一个View,从而使 B 返回 A 时的动画找不到原来的 View 报错。
解决:改调用 notifyItemChaned(position: Int, payload: Object),payload 传 0 即可。