《撸代码 学习 IOC注入技术1 》—— 布局注入 与 控件注入
不詩意的女程序媛不是好廚師~
轉(zhuǎn)載請(qǐng)注明出處,From李詩雨—https://blog.csdn.net/cjm2484836553/article/details/104539874
【源代碼下載地址】:https://github.com/junmei520/iocStudy
《擼代碼 學(xué)習(xí) IOC注入技術(shù)1 》—— 布局注入 與 控件注入
- 1.概念再理解
- 2.布局注入
- 3.控件注入
在前面的文章中我們已經(jīng)學(xué)習(xí)了 依賴注入與控制反轉(zhuǎn)的概念、注解、和反射 ,有了這些知識(shí)做鋪墊,我們就可以 更加深入的來學(xué)習(xí)一下 IOC注入技術(shù)了。
今天我們主要 來學(xué)習(xí)運(yùn)行時(shí)注入,并親自擼代碼來一步一步的實(shí)現(xiàn) 布局注入 和控件注入 。
文章的邏輯思路講的很細(xì),也很好懂,沒有什么難點(diǎn),并且文章篇幅也不長,不妨一讀哦~
1.概念再理解
溫故而知新,上篇文章中跟大家提到了 控制反轉(zhuǎn)(IOC) 和 依賴注入的概念,可能大家還是有點(diǎn) 花非花霧非霧的 感覺,今天經(jīng)過親自的擼代碼之后,我有了新的體會(huì)。在此與大家分享~
【控制反轉(zhuǎn)(IOC)】:是原來由程序代碼中主動(dòng)獲取的資源,轉(zhuǎn)變由第三方獲取并使原來的代碼被動(dòng)接收的方式,以達(dá)到解耦的效果。
按照上篇文章的內(nèi)容,我們把它看成是一種控制權(quán)的反轉(zhuǎn)。
但其實(shí),我們還可以把它看成是一種義務(wù)的轉(zhuǎn)交,即 把我們自己應(yīng)該做的事轉(zhuǎn)交給別人來做,從而讓自己變得更輕松。
再舉個(gè)形象的栗子來說吧:
在一個(gè)月黑風(fēng)高的寒冷的夜晚,你有事要出門,由于天氣太冷你要披肩大棉襖才能出去,于是你就自己乖乖的拿了棉襖再乖乖的穿好出門,消失在寒冷的黑夜中。
IOC就是你有了一個(gè)女朋友,你只告訴她你要出門,于是貼心的女朋友便給你拿來棉衣,幫你穿上,才放心讓你出門。于是你在愛的目光中出了門~
恩,女朋友就好比IOC,把你本來要拿衣服穿衣服的事情 轉(zhuǎn)交給了女朋友來做。
畫個(gè)圖來幫助大家理解:
好的,現(xiàn)在我們就開始擼代碼來學(xué)習(xí) IOC注入技術(shù)吧~
2.布局注入
我們都知道在Activity中我們 通過自己的 setContentView(R.layout.activity_main)來加入、顯示布局的。
那如果我現(xiàn)在采用ioc,不是自己來注入布局,而是讓我的女朋友來注入布局,該怎么做呢?
- ①首先,我得造一個(gè)女朋友出來!她里面有布局注入的方法。
- ②其次,我們考慮到可能所有的Activity都要用到,所以,我們?cè)贐aseActivity的onCreat中完成注入。
- ③MainActivity繼承BaseActivity。并且把setContentView(R.layout.activity_main)這句代碼去掉!
好的,到這里大家應(yīng)該都沒有什么問題吧。
現(xiàn)在大家想想,我們既然去掉了setContentView(R.layout.activity_main);這句代碼,那此時(shí)我們的MainActivity是不知道需要哪個(gè)布局的。
這該怎么辦?怎么才能知道MainActivity需要哪個(gè)布局文件呢?
那我們就要標(biāo)識(shí)出來我們所需要的布局文件呀,那怎么標(biāo)識(shí)呢?
對(duì)!用注解。就像這樣:
那接下來我們就要來自定義這個(gè)注解啦~
- ④自定義注解MyContentView。
好了,到目前為止,我們的主要邏輯就完成了。但是,此時(shí)運(yùn)行還是不能加載出布局的,因?yàn)檫@還是個(gè)假貨,我們InjectUtils中的injectLayout()還是空的,里面什么都沒有做。
所以,接下來我們的重點(diǎn)就是實(shí)現(xiàn)injectLayout()方法了。
⑤實(shí)現(xiàn)injectLayout()方法:
我們先來分析一下,在該方法中我們要做什么:
首先我們要明確的是,此處我們肯定要 運(yùn)用反射 去獲取所需信息和執(zhí)行對(duì)應(yīng)方法了。
- 第一步 獲取activity對(duì)應(yīng)的Class
- 第二步 拿到該Class上的MyContentView注解
- 第三步 取到注解括號(hào)后面的內(nèi)容,即布局id
再接下來 就要 反射在class上去執(zhí)行setContentView了:
- 第四步 利用反射獲取setContentView()對(duì)應(yīng)的method
- 第五步 反射執(zhí)行setContentView()方法。
好的,那現(xiàn)在我來運(yùn)行程序,如果可以正常顯示出來布局是不是就可以證明,我注入布局成功啦!
先給大家看一下我的布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="10dp"tools:context=".MainActivity"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center_horizontal"android:text="ioc注入技術(shù),哈哈哈~" /><Buttonandroid:id="@+id/button1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="按鈕1" /><Buttonandroid:id="@+id/button2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="按鈕2" /></LinearLayout>好的,下面就是見證奇跡的時(shí)刻啦:
成功啦!我成功啦,啊哈哈哈哈~
完成了布局注入,那我們下面繼續(xù)控件注入吧~
3.控件注入
上面我們的布局已經(jīng)注入成功,并且可以正常顯示了。
我們可以看到布局中有2個(gè)按鈕,那如果我想把這兩個(gè)按鈕注入該怎么辦呢?
即:我現(xiàn)在不想自己通過findViewById來注入按鈕,而是想讓我的【ioc女朋友】來幫我實(shí)現(xiàn)按鈕的注入~
我們先來看一下我的預(yù)期想達(dá)到的效果:
那要達(dá)到這種效果我們?cè)撛趺磳?shí)現(xiàn)呢?
有了布局注入的經(jīng)驗(yàn),相信對(duì)于 控件注入 大家還是會(huì)有大體的思路的:
我們還用之前的女朋友InjectUtils,還是在BaseActivity中進(jìn)行注入。
那我們就要在InjectUtils里添加一個(gè)控件注入的方法injectView():
現(xiàn)在我們既然不想自己使用findViewById來獲取控件,而是想用這種形式來注入控件:
那我們肯定還是要通過使用注解,并且在注解后面?zhèn)魅雽?duì)應(yīng)控件的id。
所以第①步,我們要自定義一個(gè)BindView注解:
//① 自定義一個(gè)BindView注解 @Target(ElementType.FIELD) //說明該注解是用在屬性上的 @Retention(RetentionPolicy.RUNTIME)//該注解可以保留到程序運(yùn)行的時(shí)候 public @interface BindView {int value(); }第②步,具體實(shí)現(xiàn)injectView()方法。
實(shí)現(xiàn)injectView()方法是重點(diǎn),讓我們來仔細(xì)分析一下思路:
- 首先,我們肯定還是要通過反射,所以要先拿到Activity對(duì)應(yīng)的Class.
- 拿到了clazz后,我們還要拿到clazz上的所有屬性字段(Fields)。▲▲▲
- 然后我們就要循環(huán)遍歷屬性,看屬性上是否有BindView注解。
- 如果屬性上確實(shí)拿到了BindView注解,那我們就要繼續(xù)拿到注解后面的viewId了。
- 再接著就是反射執(zhí)行findViewById方法,得到對(duì)應(yīng)的view.
- 最后要注意,對(duì)于私有屬性,無論是對(duì)它進(jìn)行讀寫,都要調(diào)用field.setAccessible(true)。▲
好的,現(xiàn)在我們控件注入的相關(guān)操作就完成了,那讓我們來改個(gè)button的名稱測(cè)試一下吧:
@MyContentView(R.layout.activity_main) public class MainActivity extends BaseActivity {@BindView(R.id.button1)Button btn1;@BindView(R.id.button2)Button btn2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//檢測(cè) 控件注入 是否成功btn1.setText("我是注入的按鈕01");btn2.setText("我是注入的按鈕02");} }下面還是見證奇跡的時(shí)刻:
怎么樣是不是不擼不知道,一擼代碼才知道原來這就是IOC技術(shù)啊,也蠻容易的嘛~
是的,布局注入和控件注入我們都輕松搞定啦。
還有一個(gè)事件注入我們沒有實(shí)現(xiàn),這個(gè)事件注入就會(huì)有點(diǎn)小難度了喲。
害怕文檔太長,大家懶得看(PS:其實(shí)是因?yàn)槲覒?,
那我們就在下篇繼續(xù)來擼代碼一步一步實(shí)現(xiàn) 事件注入 吧~~~
【源代碼下載地址】:https://github.com/junmei520/iocStudy
積累點(diǎn)滴,做好自己~
總結(jié)
以上是生活随笔為你收集整理的《撸代码 学习 IOC注入技术1 》—— 布局注入 与 控件注入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论文阅读 CVPR2022《Rethin
- 下一篇: excel转实现pdf、图片、base6