Skip to content

Commit fd6f24d

Browse files
Simplify the base class usage
1 parent 4c77866 commit fd6f24d

File tree

5 files changed

+54
-48
lines changed

5 files changed

+54
-48
lines changed

sample/src/main/java/com/dylanc/viewbinding/sample/HomeFragment.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,14 @@ package com.dylanc.viewbinding.sample
2020

2121
import android.os.Bundle
2222
import android.view.View
23-
import androidx.fragment.app.Fragment
2423
import androidx.fragment.app.setFragmentResult
25-
import com.dylanc.viewbinding.binding
24+
import com.dylanc.viewbinding.sample.base.reflection.kotlin.BaseBindingFragment
2625
import com.dylanc.viewbinding.sample.databinding.FragmentHomeBinding
2726

2827
/**
2928
* @author Dylan Cai
3029
*/
31-
class HomeFragment : Fragment(R.layout.fragment_home) {
32-
33-
private val binding :FragmentHomeBinding by binding()
30+
class HomeFragment : BaseBindingFragment<FragmentHomeBinding>() {
3431

3532
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
3633
super.onViewCreated(view, savedInstanceState)

sample/src/main/java/com/dylanc/viewbinding/sample/MainActivity.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,19 @@
1717
package com.dylanc.viewbinding.sample
1818

1919
import android.os.Bundle
20-
import androidx.appcompat.app.AppCompatActivity
2120
import androidx.core.view.isVisible
2221
import androidx.fragment.app.Fragment
2322
import androidx.viewpager2.adapter.FragmentStateAdapter
2423
import com.dylanc.viewbinding.doOnCustomTabSelected
25-
import com.dylanc.viewbinding.nonreflection.binding
26-
import com.dylanc.viewbinding.nonreflection.setCustomView
24+
import com.dylanc.viewbinding.sample.base.reflection.kotlin.BaseBindingActivity
2725
import com.dylanc.viewbinding.sample.databinding.ActivityMainBinding
2826
import com.dylanc.viewbinding.sample.databinding.LayoutBottomTabBinding
2927
import com.dylanc.viewbinding.setCustomView
3028
import com.dylanc.viewbinding.updateCustomTab
3129
import com.google.android.material.tabs.TabLayoutMediator
3230

33-
class MainActivity : AppCompatActivity() {
31+
class MainActivity : BaseBindingActivity<ActivityMainBinding>() {
3432

35-
private val binding by binding(ActivityMainBinding::inflate)
3633
private val tabs: List<CustomTab> by lazy {
3734
listOf(
3835
CustomTab(R.string.tab_home, R.drawable.ic_home_selector, HomeFragment()),

sample/src/main/java/com/dylanc/viewbinding/sample/base/reflection/kotlin/BaseBindingActivity.kt

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,17 @@ package com.dylanc.viewbinding.sample.base.reflection.kotlin
2121
import android.os.Bundle
2222
import androidx.appcompat.app.AppCompatActivity
2323
import androidx.viewbinding.ViewBinding
24-
import com.dylanc.viewbinding.base.ViewBindingUtil
24+
import com.dylanc.viewbinding.base.BindingOwner
25+
import com.dylanc.viewbinding.base.BindingOwnerDelegate
2526

2627
/**
27-
* How to modify the base class to use view binding, you need the following steps:
28-
* 1. Adds a generic of view binding to the base class.
29-
* 2. Declares a binding object.
30-
* 3. Uses [inflateBindingWithGeneric] method to create the binding object.
31-
* 4. Uses the root of the binding object instead of layout id to set content view.
32-
*
33-
* Here is the core code.
34-
*
3528
* @author Dylan Cai
3629
*/
37-
abstract class BaseBindingActivity<VB : ViewBinding> : AppCompatActivity() {
38-
39-
lateinit var binding: VB
30+
abstract class BaseBindingActivity<VB : ViewBinding> : AppCompatActivity(),
31+
BindingOwner<VB> by BindingOwnerDelegate() {
4032

4133
override fun onCreate(savedInstanceState: Bundle?) {
4234
super.onCreate(savedInstanceState)
43-
binding = ViewBindingUtil.inflateWithGeneric(this, layoutInflater)
44-
setContentView(binding.root)
35+
setContentViewWithBinding()
4536
}
4637
}

sample/src/main/java/com/dylanc/viewbinding/sample/base/reflection/kotlin/BaseBindingFragment.kt

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,41 +14,24 @@
1414
* limitations under the License.
1515
*/
1616

17-
@file:Suppress("unused", "MemberVisibilityCanBePrivate")
17+
@file:Suppress("unused")
1818

1919
package com.dylanc.viewbinding.sample.base.reflection.kotlin
2020

2121
import android.os.Bundle
2222
import android.view.LayoutInflater
23-
import android.view.View
2423
import android.view.ViewGroup
2524
import androidx.fragment.app.Fragment
2625
import androidx.viewbinding.ViewBinding
27-
import com.dylanc.viewbinding.base.ViewBindingUtil
26+
import com.dylanc.viewbinding.base.BindingOwner
27+
import com.dylanc.viewbinding.base.BindingOwnerDelegate
2828

2929
/**
30-
* How to modify the base class to use view binding, you need the following steps:
31-
* 1. Adds a generic of view binding to the base class.
32-
* 2. Declares a binding object.
33-
* 3. Uses [inflateBindingWithGeneric] method to create the binding object.
34-
* 4. Uses the root of the binding object instead of view to return content view.
35-
*
36-
* Here is the core code.
37-
*
3830
* @author Dylan Cai
3931
*/
40-
abstract class BaseBindingFragment<VB : ViewBinding> : Fragment() {
41-
42-
private var _binding: VB? = null
43-
val binding: VB get() = _binding!!
44-
45-
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
46-
_binding = ViewBindingUtil.inflateWithGeneric(this, inflater, container, false)
47-
return binding.root
48-
}
32+
abstract class BaseBindingFragment<VB : ViewBinding> : Fragment(),
33+
BindingOwner<VB> by BindingOwnerDelegate() {
4934

50-
override fun onDestroyView() {
51-
super.onDestroyView()
52-
_binding = null
53-
}
35+
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) =
36+
createViewWithBinding(inflater, container)
5437
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.dylanc.viewbinding.base
2+
3+
import android.app.Activity
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import androidx.fragment.app.Fragment
8+
import androidx.viewbinding.ViewBinding
9+
10+
interface BindingOwner<VB : ViewBinding> {
11+
val Activity.binding: VB
12+
val Fragment.binding: VB
13+
fun Activity.setContentViewWithBinding()
14+
fun Fragment.createViewWithBinding(inflater: LayoutInflater, container: ViewGroup?): View
15+
}
16+
17+
class BindingOwnerDelegate<VB : ViewBinding> : BindingOwner<VB> {
18+
private lateinit var _binding: VB
19+
20+
override val Activity.binding: VB get() = _binding
21+
22+
@Suppress("UNCHECKED_CAST")
23+
override val Fragment.binding: VB
24+
get() = requireNotNull(view) { "The property of binding has been destroyed." }
25+
.getTag(R.id.tag_view_binding) as VB
26+
27+
override fun Activity.setContentViewWithBinding() {
28+
_binding = ViewBindingUtil.inflateWithGeneric(this, layoutInflater)
29+
setContentView(binding.root)
30+
}
31+
32+
override fun Fragment.createViewWithBinding(inflater: LayoutInflater, container: ViewGroup?): View =
33+
ViewBindingUtil.inflateWithGeneric<VB>(this, inflater, container, false)
34+
.run {
35+
root.setTag(R.id.tag_view_binding, this)
36+
root
37+
}
38+
}

0 commit comments

Comments
 (0)