ViewBinding with Kotlin Property Delegate

Reduce ViewBinding code boilerplates with Kotlin Property Delegate.

ViewBinding with Kotlin Property Delegate

Reduce ViewBinding code boilerplates with Kotlin Property Delegate.

Introduction to ViewBinding

ViewBinding is a new feature of Android Gradle Plugin which allows you to access view hierarchy with type and null safety. ViewBinding is integrated with the Android Gradle Plugin directly, so it doesn’t depend on Annotation Processing (KAPT) as Butterknife does. Also, it much safer and cheaper than Kotlin Synthetic which uses HashMap<Int, View> under the hood.

Enable ViewBinding

ViewBinding is not enabled by default in Android Studio 4.1 with AGP (4.1.0), so it has to be enabled manually in build.gradle of the app module.

After enabling it, we will be able to access generated ViewBinding classes inside our Activity/Fragment.

The generated class names will be in PascalCase linked to snake_case xml resource files. For example, if we have activity_main.xml the generated class will be ActivityMainBinding , and if we have fragment_home the class will be FragmentHomeBinding . I hope you get the point!

ViewBinding Inflation

There are two ways to construct a ViewBinding instance. The first one is to inflate the view from the XML layout by calling ViewBinding.inflate(inflater: LayoutInflater) or ViewBinding.inflate(inflater: LayoutInflater, parent: ViewGroup?, attachToRoot: Boolean) . The second way is to bind with the existing view by calling ViewBinding.bind(view: View) .

The first option is a recommended way to inflate view since it gives us a single source of truth, however, in some cases, we cannot inflate it, so we bind it instead.

Calling Children Views

All views with the ID specified will be generated inside the ViewBinding class as final read-only fields. You can call them by ViewBinding#myButton . The ViewBinding holds strong references to all view fields.

In this case, we have a child button with an ID: @+id/button_say_hello , so the generated field will be binding.buttonSayHello .

camelCase

Reduce Code Boilerplates

In these examples, we have to quite a bit of code in order to get the ViewBinding instance and set it into an Activity. Let’s do something to make it shorter and more concise.

We can achieve this by using Kotlin Property Delegate & Android Lifecycle Observer.

The final result looks like this:

This property delegate will automatically inflate itself and setContentView to the Activity for you, so you don’t have to do it by yourself. Pretty cool huh?

Code Snippets

ActivityFragment

ViewBinding inside Fragment

In Fragment, we have extra work to do in order to avoid memory leaks by setting the ViewBinding reference to null inside onDestroyView method. As I mention, ViewBinding holds strong references of views so use it wisely.

A small leak will sink a great ship. — Benjamin Franklin

Conclusion

ViewBinding is currently the best way to access view hierarchy since it guarantees type-safety and compile-time errors unlike Butterknife & Kotlin Synthetic.


References: