Skip to content
/ Binding Public

Simple API implement DataBinding and ViewBinding. 简单的 API 实现 DataBinding 和 ViewBinding,欢迎 star

License

Notifications You must be signed in to change notification settings

hi-dhl/Binding

Repository files navigation

Binding

One line of code implements DataBinding and ViewBinding. Welcome star
一行代码实现 DataBinding 和 ViewBinding,欢迎 star

English   ·  中文

If the image cannot be viewed, please click here to view it img1 | img2

Thanks

About Binding

Binding simplifies the use of DataBinding and ViewBinding, and only requires one line of code to implement DataBinding and ViewBinding.

The future plan of Binding provides a general findViewById solution. Due to the iterative update of technology from butterknife, DataBinding, Kotlin synthesis method (Synthetic view) to the current ViewBinding, there may be new technologies in the future. No matter how the technology changes, just need Update Binding, the external use remains unchanged.

Kotlin synthesis method (Synthetic view) is so much more convenient than ViewBinding, why is it abandoned by Google, please check this article Kotlin 插件的落幕,ViewBinding 的崛起

Thank you for your suggestions. At present, Binding has been adapted to a large number of scenarios. At the same time, it also provides a lot of practical cases of DataBinding and ViewBinding. If you encounter Binding incompatible scenarios during use, please raise an issue and I will solve it as soon as possible. .

If this repository is helpful to you, please give me star, thank you very much for your support, and welcome you to submit a PR ❤️❤️❤️

Binding the following advantages:

  • A simple API requires only one line of code to implement DataBinding or ViewBinding
  • Support the use of DataBinding or ViewBinding in the ActivityAppCompatActivityFragmentActivityFragmentDialog
  • Support the use of DataBinding or ViewBinding in the ListAdapterPagingDataAdapterRecyclerView.Adapter
  • Support the use of DataBinding and ViewBinding in Navigaion Fragment management framework, BottomSheetDialogFragment and other scenarios
  • Avoid a lot of template code
  • Avoid memory leaks, have life cycle awareness, and automatically destroy data when the life cycle is in onDestroyed()

Download

add jcenter

Add the following code to the build.gradle file at the Project level

allprojects {
    repositories {
        jcenter()
    }
}

add dependency

Add the following code to the module level build.gradle file, and you need to enable DataBinding or ViewBinding

android {
    buildFeatures {
        dataBinding = true
        viewBinding = true
    }
}

dependencies {
    implementation 'com.hi-dhl:binding:1.0.7'
}

Usage

  • Use DataBinding and ViewBinding in Adapter (ListAdapter, PagingDataAdapter, RecyclerView.Adapter, etc.), add by viewbind() or by databind(), the example is as follows,see example
class ProductViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    
    // DataBinding
    val binding: RecycleItemProductBinding by databind()

    fun bindData(data: Product?, position: Int) {
        binding.apply {
            product = data
            executePendingBindings()
        }
    }
}

class ProductViewHolderHeader(view: View) : RecyclerView.ViewHolder(view) {

    // ViewBinding
    val binding: RecycleItemProductHeaderBinding by viewbind()

    fun bindData(data: Product?, position: Int) {
        binding.apply {
            name.text = "通过 ViewBinding 绑定的 head"
        }
    }
}

class ProductViewHolderFooter(view: View) : RecyclerView.ViewHolder(view) {
    
    // ViewBinding
    val binding: RecycleItemProductFooterBinding by viewbind()

    fun bindData(data: Product?, position: Int) {
        binding.apply {
            name.text = "通过 ViewBinding 绑定的 footer"
        }
    }
}

  • use in Activity, AppCompatActivity, and FragmentActivity, add by viewbind() or by databind(R.layout.activity_main), the example is as follows.
class MainActivity : AppCompatActivity() {

    // DataBinding
    val binding: ActivityMainBinding by databind(R.layout.activity_main)
    
    // ViewBinding
    val binding: ActivityMainBinding by viewbind()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding.apply {
            textView.setText("Binding")
        }
    }
}

class MainActivity : Activity() {
    // DataBinding
    val binding: ActivityMainBinding by databind(R.layout.activity_main)
    
    // ViewBinding
    val binding: ActivityMainBinding by viewbind()
}

class FragmentActivity : Activity() {
    // DataBinding
    val binding: ActivityMainBinding by databind(R.layout.activity_main)
    
    // ViewBinding
    val binding: ActivityMainBinding by viewbind()
}

PS: Need to pay attention to the following points:

  • If you use Navigaion Fragment management framework, you can only use Method 1see example
  • Use in BottomSheetDialogFragment ,you can only use Method 1
  • In other Fragment scenarios, if the ui is not displayed using Method 2, please use Method 1 to solve the problem
Method 1:
class FragmentNav1 : Fragment(R.layout.fragment_main) {
    
    // DataBinding
  	val binding: FragmentMainBinding by databind()
    
    // ViewBinding
  	 val binding: FragmentMainBinding by viewbind()
  
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        return binding.root
    }
}

Method 2:
class FragmentNav1 : Fragment(R.layout.fragment_main) {
    
    // DataBinding
  	val binding: FragmentMainBinding by databind()
    
    // ViewBinding
  	 val binding: FragmentMainBinding by viewbind()
  
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.apply { textView.setText("Binding") }
    }
}
  • The usage in Dialog is as follows。
class AppDialog(context: Context) : Dialog(context, R.style.AppDialog) {

    // DataBinding
    val binding: DialogAppBinding by databind(R.layout.dialog_data_binding)
    
    // ViewBinding
    val binding: DialogAppBinding by viewbind()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding.apply { result.setText("DialogAppBinding") }
    }
}

or add life cycle listening

class AppDialog(context: Context,lifecycle: Lifecycle) : Dialog(context, R.style.AppDialog) {

    // use DataBinding life cycle listening
    val binding: DialogAppBinding by databind(R.layout.dialog_data_binding, lifecycle)
    
    // use ViewBinding life cycle listening
    val binding: DialogAppBinding by viewbind(lifecycle)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding.apply { result.setText("DialogAppBinding") }
    }
}
  • Extension method that supports DataBinding to bind data when initialized,Thanks to @br3ant contribute,see example
val binding: ActivityDataBindBinding by databind(R.layout.activity_data_bind) {
    val account = Account()
    account.name = "test"
    this.account = account
}

proguard

-keepclassmembers class ** implements androidx.viewbinding.ViewBinding {
    public static ** bind(***);
    public static ** inflate(***);
}

change log

2020-12-31

  • add the use case of ViewStub in DataBinding and ViewBinding,see example

2020-12-28(V1.0.6)

  • Support Activity and Fragment to automatically bind LifecycleOwner。see issue

2020-12-21(V1.0.5)

  • Support using DataBinding and ViewBinding in navigation fragment,see example

2020-12-17(V1.0.4)

  • Support all Adapters related to RecyclerView.ViewHolder (ListAdapter, PagingDataAdapter, RecyclerView.Adapter, etc.) to use DataBinding and ViewBinding,see example

  • Extension method that supports DataBinding to bind data when initialized,Thanks to @br3ant contribute,see example

2020-12-15(V1.0.3)

  • Use of DataBinding in Dialog, by databind(R.layout.dialog_data_binding) or by databind(R.layout.dialog_data_binding, lifecycle)
  • Avoid memory leaks, have life cycle awareness, and automatically destroy data when the life cycle is in onDestroyed()
  • The minimum SDK version is reduced to 14

2020-12-14:

  • Demo adds DataBinding example
  • Demo adds ViewBinding example
  • Demo adds kotlin-parcelize example

2020-12-13(V1.0.1)

  • Use ViewBinding in Dialog, add by viewbind() or by viewbind(lifecycle)

2020-12-12(V1.0.0)

  • A simple API requires only one line of code to implement DataBinding or ViewBinding
  • Support the use of DataBinding or ViewBinding in the ActivityAppCompatActivityFragmentActivityFragment
  • Avoid a lot of template code
  • Avoid memory leaks, have life cycle awareness, and automatically destroy data when the life cycle is in onDestroyed()

contact me

  • 个人微信:hi-dhl
  • 公众号:ByteCode,包含 Jetpack ,Kotlin ,Android 10 系列源码,译文,LeetCode / 剑指 Offer / 多线程 / 国内外大厂算法题 等等一系列文章


最后推荐我一直在更新维护的项目和网站:

  • 计划建立一个最全、最新的 AndroidX Jetpack 相关组件的实战项目 以及 相关组件原理分析文章,正在逐渐增加 Jetpack 新成员,仓库持续更新,欢迎前去查看:AndroidX-Jetpack-Practice

  • LeetCode / 剑指 offer / 国内外大厂面试题 / 多线程 题解,语言 Java 和 kotlin,包含多种解法、解题思路、时间复杂度、空间复杂度分析

  • 最新 Android 10 源码分析系列文章,了解系统源码,不仅有助于分析问题,在面试过程中,对我们也是非常有帮助的,仓库持续更新,欢迎前去查看 Android10-Source-Analysis

  • 整理和翻译一系列精选国外的技术文章,每篇文章都会有译者思考部分,对原文的更加深入的解读,仓库持续更新,欢迎前去查看 Technical-Article-Translation

  • 「为互联网人而设计,国内国外名站导航」涵括新闻、体育、生活、娱乐、设计、产品、运营、前端开发、Android 开发等等网址,欢迎前去查看 为互联网人而设计导航网站

感谢

中文:

感谢 Simple one-liner ViewBinding in Fragments and Activities with Kotlin 文章带来的思路,以及从 AnkoViewBindingDelegate 和 jetpack 等等开源库中学习到技巧

English:

About

Simple API implement DataBinding and ViewBinding. 简单的 API 实现 DataBinding 和 ViewBinding,欢迎 star

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •