解决android studio会因为getSystemService导致无法预览xml中的UI【有效避开xml对java代码进行编译时不识别的问题】

前言

对于系统级应用开发时,常常会直接绑定系统的service。即使我们的应用可以正确运行在定制的android系统上,但android studio在编译时却无法有效的识别context.getSystemService()这类绑定的方法。导致我们的xml预览界面总是显示一片空白,这对于布局绘制和调整UI时,影响很大。

xml中显示红色感叹号
查看红色感叹号后显示存在无法编译的代码

起初我只能通过先屏蔽相关的java代码,或者在代码块处增加try-catch,来骗过android studio的编译环节,但当项目庞大起来后,到处都加上try-catch或者注释的行为,非常影响开发效率。而且也会存在某天失误将上述测试的代码上传到git的情况。

所以不得不寻求正确的解决方案。


解决方案

通过各大公司的AI搜索后,得到了一个有效的方法:isInEditMode()
isInEditMode方法解释

指示此视图当前是否处于编辑模式。在开发人员工具中显示时,视图通常处于编辑模式。例如,如果此视图是由可视化用户界面构建器绘制的,则此方法应返回true。如果子类的正常行为可能会干扰主机环境,则子类应检查此方法的返回值以提供不同的行为。例如:类在其构造函数中生成一个线程,绘图代码依赖于设备特定的功能等。此方法通常在自定义小部件的绘图代码中检查

如果此视图处于编辑模式,则返回True,否则返回false。

这个方法包含在最基础的View类中。可以说只要是UI相关的类,例如Activityfragment或者各种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同时使用,不仅可以对比出差异,在疑难问题上也会有不同的解题方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值