Аннотации: @EViewGroup - аргумент аннотации должен быть постоянной ошибкой времени компиляции в модуле библиотеки Android

Я пытаюсь разделить код моего существующего приложения на модуль библиотеки Android. При копировании моего рабочего кода в каталог модуля я столкнулся с проблемой с аннотациями, где строка @EViewGroup(R.layout.dialog_action_item) выдает ошибку времени компиляции с сообщением

Аргумент аннотации должен быть константой времени компиляции

Я не понимаю, почему это внезапно становится проблемой, когда в модуле приложения работает тот же самый код. Оба модуля файла gradle реализуют одни и те же зависимости, и файл макета также является копией старого файла макета.

Просмотреть файл:

import android.content.Context
import android.graphics.Typeface
import android.os.Build
import android.support.annotation.AttrRes
import android.support.v4.content.ContextCompat
import android.util.AttributeSet
import android.widget.FrameLayout
import com.lam.locationmapservicelib.R
import kotlinx.android.synthetic.main.dialog_action_item.view.*
import com.lam.locationmapservicelib.utils.ImageLoader
import com.lam.locationmapservicelib.utils.ViewManager
import com.lam.locationmapservicelib.views.dialog.DialogActionItemModel
import org.androidannotations.annotations.EViewGroup

@EViewGroup(R.layout.dialog_action_item)
open class DialogActionItem : FrameLayout {
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, @AttrRes defStyleAttr: Int) : super(context, attrs, defStyleAttr)

some methods..

}

Файл макета:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dialog_button_size">

    <TextView
        android:id="@+id/buttonText"
        style="@style/Body1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginEnd="@dimen/padding_16"
        android:layout_marginStart="@dimen/padding_16"
        android:ellipsize="end"
        android:lines="1"
        android:textAlignment="center" />
</FrameLayout>

Gradle:

kapt 'org.androidannotations:androidannotations:4.4.0'
implementation 'org.androidannotations:androidannotations-api:4.4.0'

Стек ошибок сборки:

`e: ...\LocationMapService\locationmapservicelib\build\tmp\kapt3\stubs\debug\com\lam\locationmapservicelib\fragments\map\MapFragment.java:5: error: incompatible types: <null> cannot be converted to int
@org.androidannotations.annotations.EFragment(value = null)
                                                      ^
e: ...\LocationMapService\locationmapservicelib\build\tmp\kapt3\stubs\debug\com\lam\locationmapservicelib\views\dialog\Dialog.java:5: error: incompatible types: <null> cannot be converted to int
@org.androidannotations.annotations.EViewGroup(value = null)
                                                       ^
e: ...\LocationMapService\locationmapservicelib\build\tmp\kapt3\stubs\debug\com\lam\locationmapservicelib\views\dialog\views\DialogActionItem.java:5: error: incompatible types: <null> cannot be converted to int
@org.androidannotations.annotations.EViewGroup(value = null)`

Файл gradle и layout находится в том же модуле (locationmapservicelib), что и класс DialogActionItem.

Любая помощь приветствуется!


person SteamedCow    schedule 23.07.2018    source источник
comment
Недавно я видел нечто подобное, но в моем случае я ссылался на файл макета, который был в неправильном исходном наборе вариантов сборки. Если это не так, не могли бы вы добавить к своему вопросу полную трассировку стека ошибок компиляции? Спасибо :)   -  person stkent    schedule 23.07.2018
comment
На самом деле я не использую варианты сборки для этого проекта, поэтому все файлы макета находятся в одном каталоге (для каждого модуля). Я добавил короткий стек ошибок в описание выше   -  person SteamedCow    schedule 24.07.2018
comment
Используете ли вы исходные коды выпуска / отладки? Если нет, боюсь, больше ничего не придет в голову.   -  person stkent    schedule 24.07.2018


Ответы (1)


К сожалению, поля R не являются константами в проектах библиотеки Android, поэтому мы не можем просто поместить их в параметры аннотаций.

Есть два способа решить эту проблему:

  • используйте параметр resName и передайте строку: @EViewGroup(resName = "dialog_action_item")
  • используйте плагин ButterKnife Gradle для генерации финальных полей в классе R2 и используйте их: @EViewGroup(R2.layout.dialog_action_item)

Вы должны добавить конфигурацию в AndroidAnnotations для обоих из них. См. подробную документацию по проектам библиотеки.

person WonderCsabo    schedule 15.02.2019