- Notifications
You must be signed in to change notification settings - Fork1
Simple one-liner ViewBinding in Fragments and Activities with Kotlin 🍄 Simplify usage of Android View Binding with Kotlin Property Delegates and solve behavior of Fragment’s ViewLifecycleOwner 🌱 ViewBindingPropertyDelegate
License
Kotlin-Android-Open-Source/ViewBindingDelegate
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Author:Petrus Nguyễn Thái Học
- Simplify usage of Android View Binding with Kotlin Property Delegates and solve behavior of Fragment’s ViewLifecycleOwner.
- Simple one-liner ViewBinding in Fragments and Activities with Kotlin.
- Lightweight and simple library.
ReadViewBinding Delegate — one line to get details about implementation.
Add it in your root build.gradle at the end of repositories:
- Kotlin
allprojects { repositories {... maven(url="https://jitpack.io") }}- Groovy
allprojects { repositories {... maven { url'https://jitpack.io' } }}
dependencies { implementation("com.github.hoc081098:ViewBindingDelegate:1.3.1")}https://developer.android.com/topic/libraries/view-binding#setup
importcom.hoc081098.viewbindingdelegate.*
1. Activity (with reflection).See example
Click to expand
classMainActivity :AppCompatActivity(R.layout.activity_main) {privateval viewBinding by viewBinding<ActivityMainBinding>()overridefunonCreate(savedInstanceState:Bundle?) {super.onCreate(savedInstanceState) viewBinding.button.setOnClickListener { startActivity(Intent(this@MainActivity,SecondActivity::class.java)) } }}
2. Activity (without reflection): Pass::bind method reference.See example
Click to expand
classSecondActivity :AppCompatActivity(R.layout.activity_second) {privateval binding by viewBinding(ActivitySecondBinding::bind)overridefunonCreate(savedInstanceState:Bundle?) {super.onCreate(savedInstanceState) binding.root }}
3. Fragment (with reflection).See example
Click to expand
classFirstFragment :Fragment(R.layout.fragment_first) {privateval binding by viewBinding<FragmentFirstBinding> { button.setOnClickListener(null) }overridefunonViewCreated(view:View,savedInstanceState:Bundle?) {super.onViewCreated(view, savedInstanceState) binding.button.setOnClickListener { findNavController().navigate(R.id.actionFirstFragmentToSecondFragment) } }}
4. Fragment (without reflection): Pass::bind method reference.See example
Click to expand
classSecondFragment :Fragment(R.layout.fragment_second) {privateval binding by viewBinding(FragmentSecondBinding::bind)overridefunonViewCreated(view:View,savedInstanceState:Bundle?) {super.onViewCreated(view, savedInstanceState) binding.root }}
5. Includes<merge/> tag layout: Create 2ViewBinding property.See example
Click to expand
classThirdFragment :Fragment(R.layout.fragment_third) {privateval includeBinding by viewBinding<FragmentThirdIncludeBinding>()privateval binding by viewBinding<FragmentThirdBinding> { buttonThird.setOnClickListener(null) }overridefunonViewCreated(view:View,savedInstanceState:Bundle?) {super.onViewCreated(view, savedInstanceState) includeBinding.textViewThirdInclude.text="Working..." binding.buttonThird.setOnClickListener {Toast.makeText(requireContext(),"Clicked",Toast.LENGTH_SHORT).show() } }}
6. TheDialog ofDialogFragmentSee example
ExtendsDefaultViewBindingDialogFragment or implementsViewBindingDialogFragment.
Click to expand
classDemoDialogFragment :DefaultViewBindingDialogFragment() {privateval viewBinding by dialogFragmentViewBinding(R.id.root,DialogFragmentDemoBinding::bind)privateval viewBinding2 by dialogFragmentViewBinding<DialogFragmentDemoBinding>(R.id.root)overridefunonCreateDialog(savedInstanceState:Bundle?):Dialog {returnAlertDialog.Builder(requireContext()) .setTitle("Demo dialog") .setNegativeButton("Cancel") { _, _-> } .setPositiveButton("OK") { _, _-> } .setView(R.layout.dialog_fragment_demo) .create() }overridefunonResume() {super.onResume() viewBinding.textInputLayout viewBinding2.textInputLayout }}
7.inflateViewBinding extension methods onViewGroup/LayoutInflater/Context.See example
Can be used inRecyclerView.Adapter # onCreateViewHolder to easily create aRecyclerView.ViewHolder with aViewBinding.
Click to expand
importcom.hoc081098.viewbindingdelegate.inflateViewBindingclassDemoAdapter :ListAdapter<String,DemoAdapter.VH>(...) {overridefunonCreateViewHolder(parent:ViewGroup,viewType:Int)=VH(parent inflateViewBindingfalse)overridefunonBindViewHolder(holder:VH,position:Int)= holder.bind(getItem(position))classVH(privatevalbinding:ItemRecyclerBinding) : RecyclerView.ViewHolder(binding.root) {funbind(item:String) {... } }}
MustsetContentView before accessViewBinding property. This can be done easily withconstructor:
publicAppCompatActivity(@LayoutResintcontentLayoutId) { ... }
classMainActivity :AppCompatActivity(R.layout.activity_main) {... }
Fragment'sView must be not null before accessViewBinding property. This can be done easily withconstructor:
publicFragment(@LayoutResintcontentLayoutId) { ... }
classFirstFragment :Fragment(R.layout.fragment_first) {... }
If there is any problem withProguard, add below to yourapp/proguard-rules.pro:
# ViewBindingDelegate uses Reflection.-keepclassmembers class ** implements androidx.viewbinding.ViewBinding { public static ** bind(android.view.View); public static ** inflate(android.view.LayoutInflater, android.view.ViewGroup, boolean); public static ** inflate(android.view.LayoutInflater, android.view.ViewGroup);}4. ThrowsIllegalStateException: "Attempt to get view binding when fragment view is destroyed" when accessing delegate property inonDestroyView
Since version1.0.0-alpha03 - Feb 16, 2021, we cannot access ViewBinding delegate property inonDestroyView (this causes many problems). Recommended way is passing a lambda toonDestroyView: (T.() -> Unit)? = null parameter of extension functions, eg.
- private val binding by viewBinding<FragmentFirstBinding>()+ private val binding by viewBinding<FragmentFirstBinding> { /*this: FragmentFirstBinding*/+ button.setOnClickListener(null)+ recyclerView.adapter = null+ } override fun onDestroyView() { super.onDestroyView()- binding.button.setOnClickListener(null)- binding.recyclerView.adapter = null }
Since version1.2.0,minSdkVersion has been changed to14.
MIT LicenseCopyright (c) 2020-2021 Petrus Nguyễn Thái HọcAbout
Simple one-liner ViewBinding in Fragments and Activities with Kotlin 🍄 Simplify usage of Android View Binding with Kotlin Property Delegates and solve behavior of Fragment’s ViewLifecycleOwner 🌱 ViewBindingPropertyDelegate
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Languages
- Kotlin100.0%
