Android Studio 3.1.3 - неразрешенная ссылка: R - Kotlin

Я новичок в kotlin, я преобразовал некоторый код из Java, но кажется, что там что-то не так, R в findViewById (R.id.my_id) выделен красным цветом и показывает это сообщение: "Неразрешенная ссылка: R".. Я искал решение, но, похоже, не понял, так что мне делать? Вот скриншот:

enter image description here

Ответ 1

Проблема может быть вызвана многими факторами,

  • как упомянуто martomstom в этом ответе, эта проблема иногда вызывается версией com.android.tools.build:gradle, ее изменение на более стабильную версию решит проблему: например: com.android.tools.build:gradle:3.4.0-alpha02 с com.android.tools.build:gradle:3.2.1
  • Кроме того, наличие библиотек из одной группы, но с разными версиями может вызвать проблему или даже больше ошибок времени выполнения. используйте метод группы исключений, например, такой: implementation('com.squareup.picasso:picasso:2.71828') { exclude(group: 'com.android.support') } в этом случае библиотека Picasso использует компоненты android.support, Версия библиотеки Android, используемая в Picasso, отличается от версии, используемой в настоящее время в вашем приложении, поэтому, чтобы решить эту проблему, мы должны полностью исключить ее из своей суббиблиотеки и групп классов.

  • Это также может произойти из-за несоответствия ресурсов и кода, в том числе эта строка импорта в вашей деятельности также может решить проблему: import com.package.name.R

  • Иногда это может происходить из-за IDE, производительности или памяти. Чистка проекта время от времени может сэкономить вам время, в Android Studio это будет примерно так: Build → Clean Project/Rebuild Project - Очистка наличных средств IDE также помогает с производительностью и памятью, на Android Studio это будет выглядеть так: File-> Invalidate Chases/Restart → Invalidate Cashes and Restart
  • Я заметил, что эта проблема случается со мной большую часть времени при импорте новых ресурсов. Использование запрещенных символов в их именах приведет к ошибке, такой как ., , -, UpperCase or special Letters ., , -, UpperCase or special Letters
  • И как совет, если вы используете Kotlin, я действительно рекомендую использовать расширения Kotlin в вашей деятельности, такие как: import kotlinx.android.synthetic.main.activity_page.* Или если вы используете пользовательское представление: kotlinx.android.synthetic.main.view_layout.view.* Синтез .main.view_layout.view kotlinx.android.synthetic.main.view_layout.view.* После этого в методе действия onCreat() вам нужно будет только вызвать идентификатор, например: my_edit_text_ID.text = "Kotlin Dbest!" или из пользовательского представления: mCostumView.my_edit_text_ID.text = "Kotlin Dbest!"

РЕДАКТИРОВАТЬ :

  • Я столкнулся с этой проблемой еще раз, и проблема заключалась в том, что библиотека '' R '' была импортирована из 2 разных источников:

    com.android.R

    com.example.package.R

    Вы должны импортировать только библиотеку '' R '' с именем вашего пакета приложения, в данном случае com.example.package.R Иногда библиотека вообще не импортируется, чтобы ее импортировать, нажмите на неразрешенную ссылку R и нажмите Alt + Enter

Ответ 2

Я использовал com.android.tools.build:gradle:3.3.0-alpha13 и имел ту же проблему. Переход на стабильную версию 3.2.1 решил эту проблему для меня.

Ответ 3

Так что это ошибочная ошибка.

Я собираюсь объяснить 30 000-футовый обзор происходящего. Это не ТОЧНЫЙ приказ или ТОЧНЫЙ поток, он просто чертовски близок;) поэтому, если вы знаете больше, я точно знаю порядок и буду стараться исправлять ссылки, не стесняйтесь, я вас не остановлю :).

Процесс

Файл R является сгенерированным кодом.

Есть заказ на поколение.

Gradle сделает это по волшебству, вытянет зависимости и сначала сбросит дерево предупреждений и ошибок,

затем Android конвертирует весь Kotlin в Java за кулисами. Да, верно, наш любимый Kotlin все еще должен быть Java для компиляции для нашей любимой виртуальной машины ART.

Затем он запускает и выполняет созданные вами адаптеры для JVM Statics и несколько других задач. Затем он сначала компилирует все файлы привязки данных xml для создания сгенерированных файлов привязки данных.

Если все удается, он переходит к обработке активов и ресурсов. Который создает указатели или идентификаторы для каждого ресурса, на который вы ссылаетесь в коде. Затем он пройдет и начнет компилировать код и процесс упаковки после этого.

Довольно простой процесс, но здесь кроется проблема.

Вводящая в заблуждение ошибка

Если какой-либо шаг завершается неудачно до завершения генерации R, тогда R не генерируется. Иногда все, что вам нужно сделать, - это простая перестройка, иногда все, что вам нужно, - это просто File-> Invalidate Cache and Restart. Однако чаще всего у вас возникают проблемы с кодом в вашем gradle, xml, привязке данных или ваших адаптерах, которые мешают компилятору даже достичь стадии генерации R.

Итак, следующий вопрос

"Хорошо, стреляйте, как мы устраняем неисправности, если ошибки бесполезны или отсутствуют".

Что ж, давайте сначала поговорим о том, как эти ошибки проявляются.

  • Найден повторный класс привязки данных
  • Ошибка связывания xml в строке #
  • Не удалось найти подходящую подпись привязки: customAdapterMethod
  • Не удается найти R файл правильного проекта, отображаются только параметры импорта для подмодулей или неправильные R файлы пространства имен.
  • Не удалось найти DataBindingUtility или DataBinding для действия/фрагмента
  • И много других различных способов, слишком много, чтобы перечислить их все

Далее, давайте поговорим о потенциальных кандидатах, вызывающих проблему. Как там ооочень много лол.

  • Проблемы синхронизации Gradle
  • Проблемы с кэшированием (File-> Перезапустить и сделать недействительным кэш)
  • элементы xml с неправильным пространством имен
  • элементы xml с неверными идентификаторами или ссылочные идентификаторы не по порядку (т.е. вы говорите, что выровнены по правому краю элемента, который находится ниже в документе xml, чем элемент родственного элемента, который пытается сослаться на него)
  • Проблемы с привязкой данных XML, ссылающиеся на пространство имен или член, который не существует или введен неправильно
  • Проблемы с связыванием данных XML в незаполненных точках, таких как пользовательские атрибуты с использованием адаптеров, поскольку их труднее обнаружить. то есть bind: myCustomMethod = @"myObject.mistypedProperty()"
  • Статические адаптеры JVM с проблемами или дублирующимися подписями
  • Дублированный или плохой символ в файле Strings или Dimens или любом другом XML файле в этом отношении
  • Закрытая переменная, помеченная для @Binding без свойств для доступа к ней
  • Переменная-член, помеченная для @Binding, которая соответствует методу родительского класса, вызывая дублирование, которое проявляется в почти невозможных ошибках
  • Несоответствие типов, таких как использование адаптера, который принимает (Int), но вы передаете (Int?) Через привязку данных, и он не распознается в JVM Statics до момента компиляции
  • Вы выбрали ИМПОРТ во всплывающем окне для импорта R файла субмодуля вместо файла приложения.
  • Наличие привязываемых членов в дочернем или родительском классе, но не предоставление полностью определенного пространства имен классу, приведенному в использовании XML родительского или дочернего класса. Поскольку компилятор привязки данных недостаточно умен, чтобы понять, что переменная, предоставляемая для класса Foo, также является базовым классом parentFoo, поэтому его нужно квалифицировать как android: text = "@((com.path.parentFoo) foo).parentMethod"
  • Наличие имени метода в классе, которое соответствует "сгенерированному свойству из переменной-члена @Binding", то есть firstName в качестве переменной, но затем имеет метод с именем getFirstName в родительском или дочернем классе, потому что теперь вы сопоставляете имя метода, которое будет получить автоматически сгенерированный, таким образом вызывая ошибки класса дублирования dataBindingUtility.
  • Есть много причин, но это должно дать вам ряд мест для поиска, но список можно продолжать и продолжать серьезно.

К сожалению, это часто случается в новейших технологиях, где инструменты пользовательского интерфейса еще не работают с инструментами на основе терминалов. Поэтому я предлагаю вам запустить из корня проекта в терминале с

bash gradlew assembleRelease --debug

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

Вы найдете это особенно полезным, когда начнете иметь дело с привязкой данных.

СОВЕТ:

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

Время компиляции и запуска, чтобы подтвердить отсутствие проблем, прежде чем двигаться дальше.

  • Если вы добавите несколько статических JVM скомпилировать и запустить
  • Если вы добавите переменные в ваш XML для использования
  • Если вы привязываетесь к свойствам вашей модели в 1 файле
  • Если вы добавите привязку к JVMStatic
  • Если вы добавляете привязываемые элементы или свойства к модели
  • Если вы реорганизуете перемещение наблюдаемых переменных-членов или свойств в дочерние или базовые классы
  • Любые другие элементы, связанные с XML или связыванием, которые могут повлиять на сгенерированный код.

Как я уже упоминал выше, причина состоит в том, чтобы избежать получения стольких изменений, что это становится кошмаром по поиску и устранению неисправностей, чтобы найти общую расплывчатую, ужасную ошибку, связанную с сгенерированным кодом привязки данных. Я уверен, что инструменты будут улучшаться, но сейчас, сделайте себе одолжение, компилируйте и запускайте часто при изменении связанных с Databinding элементов.

Счастливое Кодирование

Ответ 4

Используйте команды градиента.
В Android Studio в правом меню:
Gradle → :app → Tasks → build → clean.
После этого Gradle → :app → Tasks → build → build

Ответ 5

У меня была та же проблема, и я старался не переходить с версии Gradle 3.3 на версию 3.2.1 Gradle. Вместо этого я обновил Android Studio до версии 3.3, что помогло мне ;-)

Ответ 6

Это сработало для меня. Сколько работы это зависит от того, насколько велик ваш проект. Я начал новый проект, создал необходимые модули (XML, Kotlin, цвета, строки и т.д.), А затем скопировал код в модули в новом проекте из модулей старого проекта. Копирование XML экономит много времени по сравнению с воссозданием пользовательского интерфейса. В общем, это займет немного времени, но я потратил гораздо больше времени, чтобы исправить неразрешенную ошибку ссылки без нее.

Ответ 7

ПОПРОБУЙ ЭТО

Перейдите в файл content_main.xml и там вам нужно изменить

android:id="@+id/??????"> код, который вы android:id="@+id/??????"> на свой файл.

Заменить вопросительный знак ?????? с соответствующим именем файла. (ЕСЛИ вы не знаете, что id перейдите на вкладку дизайна внизу и щелкните соответствующий Asset.

С правой стороны ниже атрибутов вы можете найти идентификатор, который вы ему дали. Если он пуст, вы можете его просто назвать, и Android Studio напишет код.

Затем перезапустите Android Studio. Надеюсь, это поможет. Счастливое кодирование.

Ответ 8

Я считаю, что я наткнулся на реальный ответ (хотя и случайно).

Я также, как OP, не смог найти мой файл KT для определения местоположения R., как и другие классы, которые оказались в Java. То, что я заметил, было то, что была разница в именах файлов. Как только я исправил операторы импорта в соответствии с регистром пакета (он же папка), ошибки разрешились.

Ответ 9

У меня была такая же проблема с референсом R тоже. Наконец, Android Studio 3.3 была выпущена и с использованием 'com.android.tools.build:gradle:3.3.0' проблема была исправлена!

Ответ 10

Я обновляю Android Studio до версии 3.3.1 и решил эту проблему.

Ответ 11

Понижение версии Gradle работало для меня.

Я изменился:

Версия Gradle от: 4.10.4 до 4.4.1

и версия Gradle Plugin от: 3.3.1 до 3.1.3

Ответ 12

Прежде всего, я хотел бы сказать, что в Kotlin нет необходимости определять findviewById для элемента View/ViewGroup.

Вы можете напрямую использовать его... Это помогает читать и понимать, посмотреть

signupImpl!!.callSignupAPI(edt_firstname.text.toString(), edt_lasttname.text.toString(), edt_email.text.toString(), edt_phone_num.text.toString(), spin_country.getSelectedItem().toString(), edt_signuppassword.text.toString(), PreferenceUtility.publicKey!!,
                                                    signature!!, "mobile", edt_referralcode.text.toString().trim(), "xyz", "chrome", "bs", "192.168.2.106")

& если вы начинаете писать проект в kotlin, тогда это нормально.

но если вы конвертируете файл Java в Koltin, тогда... сначала удалите импорт R... в файл kotlin и очистите его.... и попробуйте перестроить приложения...

после этого вы получите этот пакет R import... легко...

Избегайте использования "findviewById" для просмотра... Его волшебство Котлин: "Android поймет, что по умолчанию... что вы используете в макете".

замечания

используйте последнюю версию gardel.... Версия 3.2.1 (обязательно)

Ответ 13

Я рекомендую вам использовать расширения android kotlin и сказать, что метод findbyId

здесь некоторые документы Kotlin Android Extensions

Ответ 14

Вот решение, File-> Проект Structure-> Проект, выберите версию Android Gradle Plugin как 3.2.1 из выпадающего списка. затем нажмите применить.