android-studio - 为什么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.R
MainActivity.kt 之类的内容。我能怎么做?
解决方案
这是一个层次结构问题。
考虑一下:
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
。当它被编译时,它仍然会引用相同的字段。
虽然导入它更容易,但如果您绝对不想这样做,这是一个选择。但即使是类型别名最终也会导入它,所以你不会绕过导入/合格的类名
推荐阅读
- d3.js - 如何修复返回的节点的配置?(D3、Javascript、Neo4j)
- soap - mtom 不起作用,类是由 Apache CXF 生成的,
- r - 为什么我的图表的某些美学功能没有显示?
- c - 在 C 中计算邻接列表图表示中的传出链接
- javascript - 如何使用js加载我页面上的所有音频文件
- sql-server - 如何在一个视图/控制器中使用多个存储过程和连接表?
- http - Chilkat CkHttp DownloadBd SynchronousRequest Url 编码问题
- javascript - 如何根据 Jquery 中的值向子 div 动态添加和删除类
- c# - 如果不存在,如何检查和创建文件夹?以及如何使按 K 键时每次截取一张屏幕截图?
- python - 查找列表中的对数