Skip to content

Resource IDs will be non final in AGP 7.0 #14

@gilgoldzweig

Description

@gilgoldzweig

Resource IDs will be non-final in Android Gradle Plugin version 7.0, avoid using them as annotation attributes

This is a problem because it means I won't be able to use R.layout variables in annotations.

I currently use it to associate the layout file's integer value with the R class variable name; this is to locate the layout file from the resource folder and later call inflate(layoutResId).

Currently, I solve this issue like so
Example

Given a simple ViewHolder annotation.

annotation class ViewHolder(val layoutResId: Int)

With the usage

@ViewHolder(R.layout.sample)
data class Sample(val text: String) : GencyclerModel

And the Generated R.layout class.

public final class R {
    public static final class layout {
        public static final int sample = 567541283;
    }
}

When processing the ViewHolder annotation, the processor would receive the integer value 567541283.

In the first processing cycle, the processor would analyze the R class and create a table to map the integer to the layout name, in this case, 567541283 <-> sample.

With that info, I can iterate over the layout resource directory and find the layout file with the name sample.xml.
and I can also later call inflate(R.layout.sample)

The field will be non-final in the new version, thus throw a compile-time error.

An annotation argument must be a compile-time constant.

Possible solutions

  1. (Butterknife solution) Creating a duplicate R class that will generate the R.layout variables as static final, thus removing my R class dependency.

  2. (AndroidAnnotations solution). Using strings instead of the Resources class. I'm not too fond of this solution because it will cause issues if the layout is renamed or a typo.

I'm not sure how happy I feel about both, but I honestly don't see other ways to solve it.

If anyone has a better way to solve this, I would love to hear, and if not, which solution would you prefer?

Thanks

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions