@@ -27,7 +27,7 @@ LoadingStateView loadingStateView = new LoadingStateView(binding.getRoot(), onRe
27
27
添加依赖:
28
28
29
29
``` groovy
30
- implementation 'com.github.DylanCaiCoding.ViewBindingKTX:viewbinding-base:2.0.6 '
30
+ implementation 'com.github.DylanCaiCoding.ViewBindingKTX:viewbinding-base:2.1.0 '
31
31
```
32
32
33
33
根据[ 文档] ( https://dylancaicoding.github.io/ViewBindingKTX/#/zh/baseclass ) 集成 ViewBinding,再对 ViewBinding 的根视图进行装饰。以下是在委托用法基础上修改的代码:
@@ -38,35 +38,118 @@ implementation 'com.github.DylanCaiCoding.ViewBindingKTX:viewbinding-base:2.0.6'
38
38
39
39
![ img.png] ( ../img/base_binding_activity_code.png )
40
40
41
+ <details >
42
+ <summary >查看代码</summary >
43
+
44
+ ``` kotlin
45
+ abstract class BaseBindingActivity <VB : ViewBinding > : AppCompatActivity (),
46
+ LoadingState by LoadingStateDelegate (), OnReloadListener , Decorative ,
47
+ ActivityBinding <VB > by ActivityBindingDelegate () {
48
+
49
+ override fun onCreate (savedInstanceState : Bundle ? ) {
50
+ super .onCreate(savedInstanceState)
51
+ setContentViewWithBinding()
52
+ binding.root.decorate(this , this )
53
+ }
54
+ }
55
+ ```
56
+
57
+ </details >
58
+
41
59
#### ** Fragment**
42
60
43
61
![ img.png] ( ../img/base_binding_fragment_code.png )
44
62
63
+ <details >
64
+ <summary >查看代码</summary >
65
+
66
+ ``` kotlin
67
+ abstract class BaseBindingFragment <VB : ViewBinding > : Fragment (),
68
+ LoadingState by LoadingStateDelegate (), OnReloadListener , Decorative ,
69
+ FragmentBinding <VB > by FragmentBindingDelegate () {
70
+
71
+ override fun onCreateView (
72
+ inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ?
73
+ ): View ? {
74
+ return createViewWithBinding(inflater, container).decorate(this , this )
75
+ }
76
+ }
77
+ ```
78
+
79
+ </details >
80
+
45
81
<!-- tabs:end -->
46
82
47
- 由于给基类增加了 ViewBinding 泛型,会影响到已有基类的使用。那么对于已有的项目,建议继承原基类扩展出一个支持 ViewBinding 的基类 。
83
+ 这样封装后不仅能在 Activity 或 Fragment 获取 ` binding ` 属性,还能很方便地指定显示缺省页的区域 。
48
84
49
- 我们还可以再改进一下,增加一个 ` open val contentView` 属性,修改如下。
85
+ 比如我们在已有的项目迭代开发,一些页面的布局已经写了标题栏。如果直接调用 ` showLoadingView() ` 函数,缺省页会把标题栏给覆盖了,通常要在标题栏下方显示缺省页,此时就可以重写 ` contentView ` 属性,声明在哪个控件显示缺省页,比如:
50
86
51
- <!-- tabs:start -->
87
+ ``` kotlin
88
+ class MainActivity : BaseBindingActivity <ActivityMainBinding >() {
52
89
53
- #### ** Activity**
90
+ override fun onCreate (savedInstanceState : Bundle ? ) {
91
+ super .onCreate(savedInstanceState)
92
+ showLoadingView()
93
+ // ...
94
+ }
95
+
96
+ override val contentView get() = binding.container
97
+ }
98
+ ```
54
99
55
- ![ img.png ] ( ../img/base_binding_activity_code2.png )
100
+ ### 已有的基类如何修改
56
101
57
- #### ** Fragment **
102
+ 由于要给基类增加 ViewBinding 泛型,肯定不可能直接修改基类,这会影响到已有的代码,建议继承原基类再扩展出一个支持 ViewBinding 的基类。
58
103
59
- ![ img.png ] ( ../img/base_binding_fragment_code2.png )
104
+ 假设已有的基类是这种常见的封装,通过 ` getLayoutId() ` 函数去设置布局。
60
105
61
- <!-- tabs:end -->
106
+ ``` java
107
+ public abstract class BaseActivity extends AppCompatActivity {
108
+
109
+ @Override
110
+ protected void onCreate (@Nullable Bundle savedInstanceState ) {
111
+ super . onCreate(savedInstanceState);
112
+ setContentView(getLayoutId());
113
+ initData();
114
+ initViews();
115
+ }
116
+
117
+ public abstract int getLayoutId ();
118
+ public abstract void initData ();
119
+ public abstract void initViews ();
120
+ }
121
+ ```
122
+
123
+ 目前直接继承是实现不了的,因为需要重写 ` setContentView() ` 的代码,所以要先将 ` setContentView() ` 抽到一个函数中。
124
+
125
+ ``` java
126
+ @Override
127
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
128
+ super . onCreate(savedInstanceState);
129
+ initContentView();
130
+ initData();
131
+ initViews();
132
+ }
62
133
63
- 这样重写 ` contentView ` 属性可任意指定显示缺省页的区域,比如用了 ` DrawerLayout ` ,那么需要在 ` DrawerLayout ` 的子容器显示缺省页。
134
+ protected void initContentView() {
135
+ setContentView(getLayoutId());
136
+ }
137
+ ```
138
+
139
+ 之后就可以继承基类重写该函数替换掉原来的 ` setContentView() ` 工作。
64
140
65
141
``` kotlin
66
- class MainActivity : BaseBindingActivity <ActivityMainBinding >() {
142
+ abstract class BaseBindingActivity <VB : ViewBinding > : BaseActivity (),
143
+ LoadingState by LoadingStateDelegate (), OnReloadListener , Decorative ,
144
+ ActivityBinding <VB > by ActivityBindingDelegate () {
67
145
68
- // ...
69
-
70
- override val contentView get() = binding.contentContainer
146
+ override fun initContentView () {
147
+ setContentViewWithBinding()
148
+ binding.root.decorate(this , this )
149
+ }
150
+
151
+ override fun getLayoutId () = - 1 // 使用 ViewBinding 后,就不需要布局 id 了
71
152
}
72
- ```
153
+ ```
154
+
155
+ Fragment 的修改也同理。
0 commit comments