Почему не нужен проект, созданный мастером Android Studio 3.2.1 для импорта, например, info.dodata.clipboard.R? - PullRequest
0 голосов
/ 05 ноября 2018

Я создаю проект с помощью мастера 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. Вы можете видеть это в Моем Образе.

Я надеюсь не добавлять такие, как import info.dodata.clipboard.R в MainActivity.kt в My Image, когда я использую структуру папок. Как я могу сделать?

Исходное изображение enter image description here

Мое изображение enter image description here

1 Ответ

0 голосов
/ 08 ноября 2018

Это проблема иерархии.

Учтите это:

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. Когда он скомпилирован, он все равно будет ссылаться на то же поле.

Хотя проще импортировать его, это вариант, если вы абсолютно не хотите этого делать. Но даже псевдонимы типов в конечном итоге импортируют его, поэтому вы не сможете обойтись при импорте / квалифицированных именах классов

...