Just like View Binding, but for resources.
Catalog is a Gradle plugin that generates type-safe, user-friendly extensions to resolve Android resources.
Let's see how the following string resource gets resolved without and with Catalog:
<string name="good_morning_with_weather">Good morning, %1$s! It’s %2$d°C outside.</string>Android resource resolution is overly verbose. It also uses snake case for resource identifiers, which diverts away from Java/Kotlin naming conventions. In addition, parametrized strings and plurals are not type safe. Android Studio comes with a very loose lint check for argument types, but it treats all arguments as optional and it won't flag if you miss one.
Here's how we resolve string resources without Catalog:
You can also use Catalog to access the resource id directly:
Catalog also works with plurals:
<plurals name="unread_messages">
<item quantity="one">You have %1$d unread message</item>
<item quantity="other">You have %1$d unread messages</item>
</plurals>string arrays:
<string-array name="seasons">
<item>Spring</item>
<item>Summer</item>
<item>Fall</item>
<item>Winter</item>
</string-array>and simple color resources:
<color name="red">#FFFF0000</color>In the future, other resource types like integer arrays, dimensions, etc. will also be supported.
Resource comments are also carried over to extension properties and methods:
<!-- This string resource is used in the launcher screen. -->
<string name="app_name">Catalog</string>If you're using compose, @Composable extensions will also be generated. In order to avoid
signature clashes, Compose extensions are extension methods of
com.flaviofaria.catalog.runtime.compose.[String, Plurals, StringArray] whereas standard extensions
are extension methods of com.flaviofaria.catalog.runtime.resources.[String, Plurals, StringArray],
so make sure you're importing the right class.
Catalog generates Context and Fragment extensions using context receivers.
Since these extensions are inline, there will be no increase in your app method count or any
significant impact on runtime performance.
To use Catalog, just apply the plugin to your module:
plugins {
id 'com.flaviofaria.catalog' version '0.2.1'
}By default, Catalog generates non-Compose extensions only. Compose extensions will also be generated if it detects Compose among your module dependencies. If your project is 100% written in Compose, you can explicitly turn off non-Compose extensions by adding:
catalog {
generateResourcesExtensions = false
}Similarly, you can also turn off Compose extensions:
catalog {
generateComposeExtensions = false
}







