V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhaoyuting
V2EX  ›  Android

Android Studio 提示 Cannot resolve symbol 'XXX' 问题如何解决?

  •  
  •   zhaoyuting · 2021-07-15 09:09:31 +08:00 · 10278 次点击
    这是一个创建于 1258 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现状,Android Studio 对于一些 Symbol 不能 Resolve, 具体请看图 1 、图 2 。
    图 1: https://sm.ms/image/oJinhPQ7V1kbOFr
    图 2: https://sm.ms/image/GnWVsPkcDF7y1fZ

    试过的方法
    1. Clean Project
    2. Invalidate and Restart
    均没用

    求个解决方案
    22 条回复    2021-07-21 17:21:16 +08:00
    thetbw
        1
    thetbw  
       2021-07-15 09:13:45 +08:00
    是不是 gradle 的问题,跑一下看他会报什么错
    AoEiuV020
        2
    AoEiuV020  
       2021-07-15 09:22:04 +08:00
    ListView ?这不是 android 内部的组件吗,普通安卓项目自然没法访问一些内部的变量,代码都不在你的项目里,
    要看就下载完整安卓源码项目试试,
    sunpj
        3
    sunpj  
       2021-07-15 09:31:57 +08:00
    应该是少了个依赖
    zhaoyuting
        4
    zhaoyuting  
    OP
       2021-07-15 09:33:05 +08:00
    @thetbw
    不知道怎么操作...
    整个项目可以正常打包,也能调试。

    我点进去 android SDK 的类 ListView 出现了一堆红色,后来我点进 Context 类里面也是同样的一堆红色:Cannot resolve symbol 。


    @AoEiuV020
    你们的 Android Studio 在查看 SDK 类的源代码的时候也是同样的情况吗?
    我之前没搞过 android,这个现象是不是挺正常的 . . . . 都这样?
    guchengyehai1
        5
    guchengyehai1  
       2021-07-15 09:42:37 +08:00 via iPhone
    这是因为那些 class 都是定义在系统中
    root99527
        6
    root99527  
       2021-07-15 09:44:27 +08:00
    mOldSelectedPosition 是哪里定义的?
    gtanyin
        7
    gtanyin  
       2021-07-15 09:47:16 +08:00
    @zhaoyuting 都这样,没问题
    zhaoyuting
        8
    zhaoyuting  
    OP
       2021-07-15 09:53:55 +08:00
    @root99527
    mOldSelectedPosition 是在 Adapter
    zhaoyuting
        9
    zhaoyuting  
    OP
       2021-07-15 10:00:04 +08:00
    @root99527
    mOldSelectedPosition 是在 AdapterView 里定义的。AdapterView 是 ListView 的父类的父类。
    这是我靠搜索搜到的,因为 cannot resolve symbol,没得跳转,只能手动搜了。

    @sunpj 我再看看是怎么回事

    @guchengyehai1
    @gtanyin
    好的,学习了
    secretman
        10
    secretman  
       2021-07-15 10:01:39 +08:00
    上面那些什么在系统里的都是瞎说, 你都 import 了。
    一般不管他过一段时间就好,受不了就备份 .idea 、.gradle,然后删了重新打开项目试试
    secretman
        11
    secretman  
       2021-07-15 10:02:04 +08:00
    Android Stduio 经常各种泛红但是其实没错,IDE 垃圾
    secretman
        12
    secretman  
       2021-07-15 10:03:38 +08:00
    @secretman 看走眼了,你这是源码,下载一份完整的编译吧,你现在打开的是 SDK 里面的,对不起楼上的大哥们
    cg2dev
        13
    cg2dev  
       2021-07-15 10:09:29 +08:00
    如果是 App 应用开发,这种系统包里面的报错可以忽略,因为他依赖于其他的包,但是对于你应用开发没有影响,因为你开发过程属于编译时。到了设备上是运行时,系统里面集成了他依赖的各个 jar,所以不会报错。

    如果你是系统开发,可以将他依赖的 bootclasspath 里面的 jar 全部复制到工程中以 compileOnly 的方式依赖,就可以消除奥错了。
    winterbells
        14
    winterbells  
       2021-07-15 10:20:01 +08:00 via Android
    ls 好像有种 Mac OS 帖子里喷 Windows 的感觉…
    fredli
        15
    fredli  
       2021-07-15 10:32:14 +08:00
    检查一下 JDK,再试试 Invalidate and Restart
    HarryQu
        16
    HarryQu  
       2021-07-15 12:50:34 +08:00
    我看了下 ListView 的源码,import 中报红的部分注解,点击可以跳转。报红的部分成员变量可以在父类中找到。

    但是像 ViewRootImpl 类就找不到了。如果想要研究系统源码的话,直接使用 Android SDK 并不方便。


    在别人的文章中看到的:
    在研究 Android SDK 源码的时候,经常会发现部分 API 报红,点击无法跳转,这对于研究源码来说非常的不方便。

    Android 有两种类型的 API 不能通过 SDK 访问。

    一种是在 com.android.internal 包中的 API,称之为 internal API 。

    另一种是被标记为 @hide 属性的类和方法,这是一组被隐藏的 API,称之为 hidden API 。

    当使用 Android SDK 进行开发的时候,应用默认引用了 android.jar ,它位于 SDKDir\platforms\android-X 目录下( X 代表 API 级别),默认移除了所有的被 @hide 标识的方法或者类以及 internal 包下的类。当应用在设备上运行时,它会加载 framework.jar 。简单来说,framework.jar 和 android.jar 等同,但是没有移除 internal API 和 hidden API 。Hidden API 之所以被隐藏,是想阻止开发者使用 SDK 中未完成或不稳定的部分。因为这些 API 可能有问题:

    1. 隐藏的 API 在未来的 Android 版本中可能被删除。
    2. 可能会被修改方法签名或字段类型。
    3. 设备制造商还可能会删除或修改隐藏的 API,这可能会影响这部分设备。

    引用的两篇文章:
    https://zhuanlan.zhihu.com/p/33241064
    https://www.jianshu.com/p/fbf45770ecc8
    rrZ2C
        17
    rrZ2C  
       2021-07-15 16:57:40 +08:00
    是不是 因为 @UnsupportedAppUsage
    /**
    * The last selected position we used when notifying
    */
    @UnsupportedAppUsage
    int mOldSelectedPosition = INVALID_POSITION;
    mail2dechao
        18
    mail2dechao  
       2021-07-15 17:40:34 +08:00
    将对应的依赖重新删除添加并同步就好了
    fan123199
        19
    fan123199  
       2021-07-16 00:41:38 +08:00
    对于自己工程,要各种删除.gradle .idea build 等目录可解决。但是源码,我没有找到银弹
    ikas
        20
    ikas  
       2021-07-16 15:07:37 +08:00
    你这是看源码...sdk 带的那个也不是完整系统源码啊....跟你项目没有任何关系..
    Helsing
        21
    Helsing  
       2021-07-17 14:55:26 +08:00 via iPhone
    楼上说的对,你查看的是源码,里面飘红是很正常的,因为引用了很多其他的系统源码,而你的工程里又没有。想看源码的话可以谷歌一下怎么把源码导入 Android Studio
    zhanlanhuizhang
        22
    zhanlanhuizhang  
       2021-07-21 17:21:16 +08:00
    你这是遇到了极端情况,你把编译的所有相关文件全部删除。然后改个名称。重新打开就可以了。settings.gradle 里面的项目名称也改一下。rootProject.name
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5593 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:34 · PVG 09:34 · LAX 17:34 · JFK 20:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.