Home

Awesome

<p align="center"> Binding </p>

<p align="center"> Simple API implement DataBinding and ViewBinding. Welcome star<br/> 简单的 API 实现 DataBinding 和 ViewBinding,欢迎 star </p> <p align="center"> <a href="https://github.com/hi-dhl/Binding">English</a> &nbsp; · &nbsp;<a href="https://github.com/hi-dhl/Binding/blob/main/doc/README_CN.md">中文</a> </p> <p align="center"> <a href="https://github.com/hi-dhl"><img src="https://img.shields.io/badge/GitHub-HiDhl-4BC51D.svg?style=flat"></a> <img src="https://img.shields.io/badge/language-kotlin-orange.svg"/> <a href="https://search.maven.org/search?q=g:%22com.hi-dhl%22%20AND%20a:%22binding%22"><img src="https://img.shields.io/maven-central/v/com.hi-dhl/binding.svg?label=Maven%20Central"/></a> <img src="https://img.shields.io/badge/platform-android-lightgrey.svg"/> </p> <p align="center"> If the image cannot be viewed, please click here to view it <a href="http://img.hi-dhl.com/vbdb.png"> img1 </a> | <a href="http://img.hi-dhl.com/ViewBidnding.png"> img2 </a></p> <p align="center"> <image src="http://img.hi-dhl.com/vbdb.png" width = 600px/> </p> <p align="center"> <image src="http://img.hi-dhl.com/ViewBidnding.png" width = 600px/> </p>

Thanks

About Binding

Binding has been migrated to Maven Central because jCenter will be deprecated

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.

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:

Download

Binding has been migrated to Maven Central because jCenter will be deprecated

add jcenter

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

allprojects {
    repositories {
        // aliyun center 包含 mavenCentral 和  jcenter
        maven { url "https://maven.aliyun.com/repository/public" }
        // maven
        mavenCentral()
    }
}

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:${binding_version}'
}

The latest version

simple API

Binding provides a simple API as shown below.

ViewBinding

val binding: ActivityViewBindBinding by viewbind()

DataBinding

val binding: ActivityDataBindBinding by databind(R.layout.activity_data_bind)
or
val binding: ActivityDataBindBinding by databind()

let's see how to use in Ativity, Fragment, Dialog, Adapter, include, merge, ViewStub , Navigation , ViewGroup etc.

Usage

Use DataBinding and ViewBinding in Custom ViewGroup,

A detailed example is shown below。

class ViewBindCustomView @JvmOverloads constructor(
    context: Context,
    attr: AttributeSet? = null,
    defStyleAttr: Int = 0,
) : LinearLayout(context, attr, defStyleAttr) {

    // ViewBinding
    
    // When the root layout is the merge tag, use this method for initialization
    val binding: LayoutViewCustomBinding by viewbind(this)
    
    // When the root layout is a non-merge label, use this method to initialize
    val binding: LayoutViewCustomBinding by viewbind()
    
    // DataBinding
    val binding: LayoutViewCustomDataBinding by databind(R.layout.layout_view_custom_data)

    init {
        with(binding) {
            result.setText("Use DataBinding and ViewBinding in Custom ViewGroup")
        }
    }
}

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"
        }
    }
}

use in Activity, AppCompatActivity, and FragmentActivity, add by viewbind() or by databind(R.layout.activity_main).

class MainActivity : AppCompatActivity() {

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

There are two ways in Fragment, and their use positions are different, as shown below.

Method 1:
class FragmentNav1 : Fragment() {
    
    // 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
}

Do not want to generate a binding class for a layout, add the following attributes to the root view of the layout file

<LinearLayout tools:viewBindingIgnore="true" >
</LinearLayout>

proguard

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

change log

2023-04-13(V1.2.0)

2022-10-07(V1.1.9)

2022-7-13(V1.1.7)

2022-5-12(V1.1.5)

2022-5-03(V1.1.4)

2021-5-09(V1.1.3)

2021-3-09(V1.1.2)

2021-1-25(V1.0.9)

2021-1-14(V1.0.8)

2020-12-31

2020-12-28(V1.0.6)

2020-12-21(V1.0.5)

2020-12-17(V1.0.4)

2020-12-15(V1.0.3)

2020-12-14:

2020-12-13(V1.0.1)

2020-12-12(V1.0.0)

contact me

<img src='http://cdn.51git.cn/2020-10-20-151047.png' width = 350px/>

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