前不久升级了Android Studio Dolphin 版本,当时发现 xml布局无法预览,那会没当回事,感觉估计是google 写了一个bug,等一下后续的patch 就可以自动修复, 结果今天更新了 patch1 发现bug 还在,当时觉得应该就不是简简单单的bug问题了, 应该是 谷歌单纯的 修改了xml 布局的预览规则, 应该是我们某些地方不符合这些规则导致的
没办法那就定位问题看看,如何解决
首先确定的是,不是所有xml布局都无法预览,而是部分含有自定义view的布局无法预览
这就奇怪了,为啥谷歌的自定义view 比如RV 约束布局可以支持预览?我们自己项目内的就不行?
报错的地方如图所示:

注意了 这里明显有一个 -1 的提示,还有一个style的提示 我们转到对应的 view代码里去看看

这里就是疑似有问题的代码了
修复起来其实不难,只要按照标准的自定义写法即可

再看看其他无法预览的布局
例如这个:

说这里有个空指针 我们看下这里的代码 是啥
private final static int DEFAULT_NORMAL_MAX_WIDTH = BaseApplication.getApplication().getResources().
getDimensionPixelOffset(R.dimen.dp247);
这就奇怪了,这里就是一个 简单的 dp转px 为啥会空指针呢,application还能为空? 其实也是可能的啊, 你想想布局的预览其实 并不在一个真实的android环境里,这里当然是有可能为null的, 这里就不得不联想到compose的布局预览, 那个才叫真实的布局预览呀,大家有条件赶紧转吧
回到主题中来,我们这个其实仔细思考一下 既然都是自定义view 了,没必要获取applicaton的context 稍微改一下代码就行了, 改完以后再build

发现还是报错, 心态崩了,
跟过去一看,这个函数里面 确实需要application的context,那怎么办? 没关系,我们判断一下如果是预览模式下 返回一个固定的值就可以了

再看看,诶,怎么还有的布局无法预览? 看看报啥错?

完蛋了,这次报错的怎么是个谷歌的自定义view? 谷歌也错了吗? 其实仔细看这个报错信息 他是说这个view 需要一个指定的theme
在这里调整一下布局theme即可:

要什么theme 给什么theme 即可

改一下,布局即可正常预览
大概就是这些吧,剩下的 都是大同小异的一些改法了,大家尽快适配 新版本的android studio吧
最后我们可以想一想, 谷歌为啥在新版本的studio 强校验了自定义view的 xml布局预览?
其实主要还是为了 规范大家的自定义view写法,和 agp sdk lint 等升级一下 一堆报错一样, 是强制大家规范代码的一个手段。
另外大家也可以思考下,自己写的自定义view, 无法预览 是不是因为有些代码写的太耦合了,view 应该就做view的事,不应该和某些你自己的业务代码相关联, 相关联的时候 当你这个view 处于xml的预览环境 自然就容易出问题了
最后 生命苦短 用compose吧。。。。
作者:vivo祁同伟
链接:https://juejin.cn/post/7161030161314349063
网友评论