Android 开发所遇问题

1. 环境问题

2018-7-25

问题:AVD启动不了 —— 报x86需要加速程序错误 —— 在SDK管理器中重新安装这个组件出错 —— 报Hyper-V Hyper-Vx冲突

解决:win10 —— 控制面板 》程序与功能 》启用或关闭Windows功能 —— 取消选择Hyper-V


2. AndroidStudio问题

2021-02-16

问题:对 drawable layout 进行大量替换和修改,编译出错:AAPT: error drawable not found

解决:没有解决了,无论怎么刷新、重启、修改、删除新增都不行,只能重新建一个项目,复制文件。

更新:是界面新版本,drawable xml 不能设置 tint

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. 代码问题

2021-11-04

问题:Android 6.0 之前使用代码设置LinearLayout子View 的 margin,有时候会无效

原因:不同版本LinearLayout.generateLayoutParams方法不一样,新版本会处理参数是MarginLayoutParams时候的情况。旧版下,会因为此方法没有处理,导致LinearLayout.addView方法,会因参数是MarginLayoutParams而不是LinearLayout.LayoutParams时,丢掉margin信息。

解决:addView时确保使用的是LinearLayout.LayoutParams。同理,RelativeLayout也一样。

2021-05-14

问题:RecyclerView setAdapter 与 adapter.notifyDatasetChanged 几乎同时执行时,显示异常

解决:只执行一个

2021-04-04

问题:给LinearLayout 或者 RecyclerView设置.9图之后,子View的位置发生变化。

原因:可能是个BUG,改变View背景可能会改变view的padding

解决:设置背景后,重新设置padding

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 即可。

你可能感兴趣的:(Android 开发所遇问题)