Android studio 为什么不需要';Android Studio 3.2.1向导创建的项目是否可以导入info.dodata.clipboard.R?

Android studio 为什么不需要';Android Studio 3.2.1向导创建的项目是否可以导入info.dodata.clipboard.R?,android-studio,kotlin,android-resources,Android Studio,Kotlin,Android Resources,我通过Android Studio 3.2.1向导创建了一个项目,并保留了所有文件夹结构,文件MainActivity.kt位于文件夹info.dodata.myapplication中 我可以使用R.layout.activity\u main,而不使用导入信息.dodata.clipboard.R。您可以在原始图像中看到它 如果我更改文件夹结构,并将MainActivity.kt放在文件夹ui中,我必须导入info.dodata.clipboard.R。你可以在我的照片上看到 当我使用自己的

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

我可以使用
R.layout.activity\u main
,而不使用导入信息.dodata.clipboard.R。您可以在原始图像中看到它

如果我更改文件夹结构,并将MainActivity.kt放在文件夹ui中,我必须
导入info.dodata.clipboard.R
。你可以在我的照片上看到

当我使用自己的文件夹结构时,我希望不要在MainActivity.kt中添加
import info.dodata.clipboard.R
。我该怎么办

原始图像

我的图像
这是一个层次问题

考虑这一点:

Root .
     |
     +- package
         + sub
           + SubClass.java
         + other
           + OtherClass.java
           + SubOtherClass.java
         + Main.java
         + MainKotlin.kt
这些可以是Kotlin文件,Java文件,任何东西,都无所谓

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

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

  • 其他包
  • 子包
  • 父包(在这种情况下不适用,但适用相同的规则)
它需要显式地导入它们。所以这个Main.java:

public class Main {
    private SubClass subClassInstance;
    private MainKotlin kotlinInstance;
    // Content
}
只需要导入子类。如果显式添加MainKotlin的导入,IntelliJ/androidstudio会说它没有被使用

关于你的问题:

您的包名为
ui
,它位于根目录中。但是,您的包ID是
info.dodata.clipboard
。因此,它将在其中生成R文件。您可以更改该包,但仍需要为该包之外的文件导入该包

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

因此,您有两种选择:

第一个相对简单:将活动移动到
info.dodata.clipboard
包中

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

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


正如我所说,解决这个问题的一种方法是更改应用程序ID。不过,这并不一定可行,如果你将其发布到应用程序商店,它也会改变显示方式。波斯特对此解释得很好

但是,如果您完全没有心情添加导入(依我看,这更容易),可以添加类型别名

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

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

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

而且,您不能仅仅
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\u main
。编译后,它仍将引用同一字段


虽然只导入它比较容易,但如果您绝对不想这样做,这是一个选项。但即使是类型别名最终也会导入它,因此您也无法绕过导入/限定类名

,因为Android Studio在
info.dodata.clipboard
(在您的情况下)包下生成了
R.java
文件,该文件是项目的主包名。这与使用Java的Android项目相同(您使用的是Kotlin)。在我看来,这没有问题,我不确定这种行为是否可以改变。谢谢!当我使用自己的文件夹结构时,我希望不要在MainActivity.kt中添加诸如import info.dodata.clipboard.R之类的内容。我该怎么办?谢谢!是否有一些方法可以进行一些设置,而不是将我的活动移动到
info.dodata.clipboard
包中,以避免
import info.dodata.clipboard
如我所说,这取决于包ID(IIRC)。如果您更改应用程序ID,则会更改R位置。不过,我有第二个想法,但我需要先测试一下