Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

NotificationsYou must be signed in to change notification settings

Kotlin-Android-Open-Source/ViewBindingDelegate

 
 

Repository files navigation

  • 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.

MonthWeekAndroid TestsAndroid build CIJitpackGitHubktlintKotlinAPIHits

Medium article

ReadViewBinding Delegate — one line to get details about implementation.

Getting Started

1. Add the JitPack repository to your build file

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

2. Add the dependency

dependencies {  implementation("com.github.hoc081098:ViewBindingDelegate:1.3.1")}

3. Enable ViewBinding

https://developer.android.com/topic/libraries/view-binding#setup

Usage

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) {... }  }}

Note

1. Activity

MustsetContentView before accessViewBinding property. This can be done easily withconstructor:

publicAppCompatActivity(@LayoutResintcontentLayoutId) { ... }
classMainActivity :AppCompatActivity(R.layout.activity_main) {... }

2. Fragment

Fragment'sView must be not null before accessViewBinding property. This can be done easily withconstructor:

publicFragment(@LayoutResintcontentLayoutId) { ... }
classFirstFragment :Fragment(R.layout.fragment_first) {... }

3. Proguard

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  }

5. Min SDK version

Since version1.2.0,minSdkVersion has been changed to14.

License

MIT LicenseCopyright (c) 2020-2021 Petrus Nguyễn Thái Học

About

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

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Kotlin100.0%

[8]ページ先頭

©2009-2025 Movatter.jp