@@ -27,7 +27,7 @@ LoadingStateView loadingStateView = new LoadingStateView(binding.getRoot(), onRe
2727添加依赖:
2828
2929``` groovy
30- implementation 'com.github.DylanCaiCoding.ViewBindingKTX:viewbinding-base:2.0.6 '
30+ implementation 'com.github.DylanCaiCoding.ViewBindingKTX:viewbinding-base:2.1.0 '
3131```
3232
3333根据[ 文档] ( https://dylancaicoding.github.io/ViewBindingKTX/#/zh/baseclass ) 集成 ViewBinding,再对 ViewBinding 的根视图进行装饰。以下是在委托用法基础上修改的代码:
@@ -38,35 +38,118 @@ implementation 'com.github.DylanCaiCoding.ViewBindingKTX:viewbinding-base:2.0.6'
3838
3939![ img.png] ( ../img/base_binding_activity_code.png )
4040
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+
4159#### ** Fragment**
4260
4361![ img.png] ( ../img/base_binding_fragment_code.png )
4462
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+
4581<!-- tabs:end -->
4682
47- 由于给基类增加了 ViewBinding 泛型,会影响到已有基类的使用。那么对于已有的项目,建议继承原基类扩展出一个支持 ViewBinding 的基类 。
83+ 这样封装后不仅能在 Activity 或 Fragment 获取 ` binding ` 属性,还能很方便地指定显示缺省页的区域 。
4884
49- 我们还可以再改进一下,增加一个 ` open val contentView` 属性,修改如下。
85+ 比如我们在已有的项目迭代开发,一些页面的布局已经写了标题栏。如果直接调用 ` showLoadingView() ` 函数,缺省页会把标题栏给覆盖了,通常要在标题栏下方显示缺省页,此时就可以重写 ` contentView ` 属性,声明在哪个控件显示缺省页,比如:
5086
51- <!-- tabs:start -->
87+ ``` kotlin
88+ class MainActivity : BaseBindingActivity <ActivityMainBinding >() {
5289
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+ ```
5499
55- ![ img.png ] ( ../img/base_binding_activity_code2.png )
100+ ### 已有的基类如何修改
56101
57- #### ** Fragment **
102+ 由于要给基类增加 ViewBinding 泛型,肯定不可能直接修改基类,这会影响到已有的代码,建议继承原基类再扩展出一个支持 ViewBinding 的基类。
58103
59- ![ img.png ] ( ../img/base_binding_fragment_code2.png )
104+ 假设已有的基类是这种常见的封装,通过 ` getLayoutId() ` 函数去设置布局。
60105
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+ }
62133
63- 这样重写 ` contentView ` 属性可任意指定显示缺省页的区域,比如用了 ` DrawerLayout ` ,那么需要在 ` DrawerLayout ` 的子容器显示缺省页。
134+ protected void initContentView() {
135+ setContentView(getLayoutId());
136+ }
137+ ```
138+
139+ 之后就可以继承基类重写该函数替换掉原来的 ` setContentView() ` 工作。
64140
65141``` kotlin
66- class MainActivity : BaseBindingActivity <ActivityMainBinding >() {
142+ abstract class BaseBindingActivity <VB : ViewBinding > : BaseActivity (),
143+ LoadingState by LoadingStateDelegate (), OnReloadListener , Decorative ,
144+ ActivityBinding <VB > by ActivityBindingDelegate () {
67145
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 了
71152}
72- ```
153+ ```
154+
155+ Fragment 的修改也同理。
0 commit comments