首页 > 解决方案 > 为什么Android Studio 3.2.1 向导创建的项目不需要导入info.dodata.clipboard.R?

问题描述

我通过 Android Studio 3.2.1 向导创建了一个项目并保留所有文件夹结构,文件 MainActivity.kt 位于文件夹info.dodata.myapplication

我可以R.layout.activity_main不使用诸如import info.dodata.clipboard.R. 您可以在 Origin Image 上看到它

如果我更改文件夹结构,并将 MainActivity.kt 放在文件夹ui中,我必须import info.dodata.clipboard.R. 您可以在我的图片中看到它。

当我使用自己的文件夹结构时,我希望不要在 My Image 中添加诸如import info.dodata.clipboard.RMainActivity.kt 之类的内容。我能怎么做?

原始图像 在此处输入图像描述

我的形象 在此处输入图像描述

标签: android-studiokotlinandroid-resources

解决方案


这是一个层次结构问题。

考虑一下:

Root .
     |
     +- package
         + sub
           + SubClass.java
         + other
           + OtherClass.java
           + SubOtherClass.java
         + Main.java
         + MainKotlin.kt

那些可以是 Kotlin 文件,Java 文件,任何东西,没关系。

Main.java 可以访问同一个包中的类、接口等,无需导入。

这意味着,如果 Main.java 或 MainKotlin.kt 中的任何一个想要访问以下类中的类:

  • 其他套餐
  • 子包
  • 父包(在这种情况下不适用,但适用相同的规则)

它需要显式地导入它们。所以这个Main.java:

public class Main {
    private SubClass subClassInstance;
    private MainKotlin kotlinInstance;
    // Content
}

只需要导入子类。如果您为 MainKotlin 显式添加导入,IntelliJ/Android Studio 会说它未使用。

关于你的问题:

你的包被称为ui,它位于根目录中。但是,您的包裹 ID 是info.dodata.clipboard. 结果,它将在那里生成 R 文件。您可以更改包,但您仍然需要为该包之外的文件导入它。

因此,任何不在info.dodata.clipboard包中的活动,即子包、父包或完全独立的包,都需要显式导入。

所以,你有两个选择:

第一个比较简单:将你的活动移到info.dodata.clipboard包中

第二个是您当前正在使用的那个;导入它。

大多数现代 IDE 和编辑器都具有自动完成功能,因此您无需在任何需要的地方复制粘贴导入语句。将插入符号放在R一个新文件中(当它显示未解析的引用时),然后使用Alt+ Enter


就像我说的,解决此问题的一种方法是更改​​应用程序 ID。不过,这不一定可行,如果您将其发布到应用商店,它也会改变它的显示方式。这篇文章很好地解释了这一点。

但是,如果您绝对不想添加导入(IMO 更容易),您可以添加类型别名。

在我开始之前,我想提一下为什么这会起作用,但也有局限性。

您可以将任何适用的内容放在与您的活动相同的包中。正如我已经提到的,当它在同一个包中时,您不需要显式导入。

但是,如果您有多个包含活动的包,则需要为每个包重复这些活动,这是一个弱点。

此外,您不能只是typealias R = com.package.R;,因为它不允许您访问子类。但是,您可以这样做:

typealias id = com.example.R.id;
typealias layout = com.example.R.layout;
typealias anim = com.example.R.anim;
// ... and so on
// Optionally importing it for this and just using `R.layout` instead of `com.package.R.layout`

就像我说的那样,这会阻止您使用R.type.name. 但它确实允许你写layout.activity_main。当它被编译时,它仍然会引用相同的字段。

虽然导入它更容易,但如果您绝对不想这样做,这是一个选择。但即使是类型别名最终也会导入它,所以你不会绕过导入/合格的类名


推荐阅读