前言
对于系统级应用开发时,常常会直接绑定系统的service
。即使我们的应用可以正确运行在定制的android
系统上,但android studio
在编译时却无法有效的识别context.getSystemService()
这类绑定的方法。导致我们的xml
预览界面总是显示一片空白,这对于布局绘制和调整UI时,影响很大。
起初我只能通过先屏蔽相关的java
代码,或者在代码块处增加try-catch
,来骗过android studio
的编译环节,但当项目庞大起来后,到处都加上try-catch
或者注释的行为,非常影响开发效率。而且也会存在某天失误将上述测试的代码上传到git
的情况。
所以不得不寻求正确的解决方案。
解决方案
通过各大公司的AI搜索后,得到了一个有效的方法:isInEditMode()
指示此视图当前是否处于编辑模式。在开发人员工具中显示时,视图通常处于编辑模式。例如,如果此视图是由可视化用户界面构建器绘制的,则此方法应返回true。如果子类的正常行为可能会干扰主机环境,则子类应检查此方法的返回值以提供不同的行为。例如:类在其构造函数中生成一个线程,绘图代码依赖于设备特定的功能等。此方法通常在自定义小部件的绘图代码中检查
如果此视图处于编辑模式,则返回True,否则返回false。
这个方法包含在最基础的View
类中。可以说只要是UI相关的类,例如Activity
、fragment
或者各种layout
等,都具有此方法,可以直接调用。
只需要在getSystemService
附近,使用isInEditMode
将方法包起来,那么在编译检查阶段,xml
将会忽略此函数内的方法。也就跳过了编译时会提示方法找不到或方法为空等问题了。
if (!isInEditMode()) {
Context context = getContext();
if (context != null) {
SomeService service = (SomeService) context.getSystemService(Context.SOME_SERVICE);
}
}
当然,对于感叹号比较多的页面,建议直接简单粗暴一点,在初始化界面时,就排除掉一些会动态修改UI的类。这样可能只要加一处或两处,后续新增代码时都不用考虑xml
编译不识别的问题了。
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
initView();
if (!isInEditMode()) { //使用isInEditMode()判断当前是否处于设计模式,避免在预览时因为一些系统方法导致应用不识别,间接影响XML的预览
initClick();
initOther();
}
}
后续
笔者也尝试过通过百度或bing去搜索相同的问题,但是搜索引擎无法正确理解到我的需求。
在以前,掌握正确的提问关键词和从茫茫网页信息中获取有效内容,是一个程序员的基本技能。但在如今各大网站禁止爬虫且各网站帖子重复、低质量的今天,多年的搜索技能在解决相对较冷门的问题上,是显的如此的无力。
好在deepspeek成功拉高了国内AI搜索的质量,让各大AI搜索又重新站在了一个新的起跑线上。又得益于AI竞争的福利,现在各个平台的AI都能免费使用。例如阿里的通义千问、腾讯的元宝ai、或者原始的deepspeek官网(网络质量较差,建议当备用),都是比较不错的选择。
笔者使用同样的问题进行提问,对比下来虽然回复结果有差异,但都能给出正确的结果。建议大家使用时,也多个AI同时使用,不仅可以对比出差异,在疑难问题上也会有不同的解题方向。