Это проблема иерархии.
Учтите это:
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
, который лежит в корне. Тем не менее, ваш идентификатор пакета info.dodata.clipboard
. В результате он сгенерирует R-файл там. Вы можете изменить пакет, но вам все равно придется импортировать его для файлов вне этого пакета.
В результате любые действия, не входящие в пакет info.dodata.clipboard
, что означает подпакеты, родительские пакеты или полностью отдельные пакеты, должны явно импортировать его.
Итак, у вас есть два варианта:
Первый относительно прост: перенесите свои действия в пакет info.dodata.clipboard
Второй - тот, который вы сейчас используете; импортировать это.
Большинство современных IDE и редакторов имеют автозаполнение, поэтому вам не нужно копировать и вставлять оператор импорта везде, где вам это нужно. Поместите курсор на R
в новом файле (когда он показывает неразрешенную ссылку) и используйте Alt + Enter .
Как я уже сказал, один из способов исправить это - изменить идентификатор приложения. Это не обязательно выполнимо, а также изменит способ отображения, если вы разместите его в магазине приложений. Этот пост объясняет это довольно хорошо.
Однако, если вы абсолютно не в настроении для добавления импорта (что, 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
. Когда он скомпилирован, он все равно будет ссылаться на то же поле.
Хотя проще импортировать его, это вариант, если вы абсолютно не хотите этого делать. Но даже псевдонимы типов в конечном итоге импортируют его, поэтому вы не сможете обойтись при импорте / квалифицированных именах классов