janishar / PlaceHolderView

This library provides advance views for lists and stacks. Some of the views are build on top of RecyclerView and others are written in their own. Annotations are compiled by annotation processor to generate bind classes. DOCS -->
http://janishar.com/PlaceHolderView
Apache License 2.0
2.11k stars 369 forks source link

Can not annotate with R constants #142

Open Pomis opened 6 years ago

Pomis commented 6 years ago

Having strange bug: Trying to use it like this

@Layout(R.layout.section_item)
class SectionPlaceholder(private val section : Section) {

    @View(R.id.title_textView)
    lateinit var tvTitle: TextView

    @View(R.id.content_textView)
    lateinit var tvContent: TextView

    @Resolve
    fun onResolve() {
        tvTitle.text = section.title
        tvContent.text = section.content
    }
}

But Studio underlines all R.layout/R.id usages and says that An annotation argument must be a compile-time constant. If I try to compile, I get:

 error: incompatible types: <null> cannot be converted to int
@com.mindorks.placeholderview.annotations.Layout(value = null)
                                                         ^

If I use generated constants it fails with runtime exception (res not found)

@Layout(0x7f0f0023)
class SectionPlaceholder(private val section : Section) {

    @View(0x7f0c0071)
    lateinit var tvTitle: TextView

    @View(0x7f0c0020)
    lateinit var tvContent: TextView

    @Resolve
    fun onResolve() {
        tvTitle.text = section.title
        tvContent.text = section.content
    }
}

Used versions:

implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.mindorks.android:placeholderview:1.0.3'
kapt 'com.mindorks.android:placeholderview-compiler:1.0.3'

If I use old version (0.7.3) I have the same issue Used plugins:

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

kotlin version: 1.2.51. Everything works with usual RecyclerView

dnnyg33 commented 5 years ago

did you ever get this working? i'm surprised no one else has mentioned this issue since it immediately happened when i tried to use the project.

Pomis commented 5 years ago

No I decided to use vanilla RecyclerView in that project. Maybe issue was caused by multi module architechture, I don't know

thphuoc commented 5 years ago

I have the same issue

jas10022 commented 5 years ago

has anyone fixed this issue yet?

thphuoc commented 5 years ago

has anyone fixed this issue yet?

Cannot use an annotation in library module to bind to a resource in app module. Because, All of library will be build and process annotation before build app module. So that, the resource id always is 0. Another workaround: Step 1: Disable all of libraries that poiting to resource: Butterknife, PlaceHolderView,... Step 2: Build app module and copy R.java to the same package name in library module Step 3: Reenable above libraries and then rebuild

CloseFile commented 4 years ago

has anyone fixed this issue yet?

Cannot use an annotation in library module to bind to a resource in app module. Because, All of library will be build and process annotation before build app module. So that, the resource id always is 0. Another workaround: Step 1: Disable all of libraries that poiting to resource: Butterknife, PlaceHolderView,... Step 2: Build app module and copy R.java to the same package name in library module Step 3: Reenable above libraries and then rebuild

Thank you sir. This method work for me. But AS now not show R.java. Need decompile apk and get R.java file. And after some changes in res files AS change some id rebuild and will be crashed (

CloseFile commented 3 years ago

Found a working solution. Change module lib to dynamic future module.