Kotlin&mvp&模塊化&dagger&rx全家桶<一>

Kotlin就不說了..谷歌爸爸的親兒子...
MVP就不說了..解耦徹底..利于維護
模塊化就不說了..解耦更徹底..更利于維護
dagger就不說了..注入引用..
rx就不說了...跟著潮流走就行...

step1

新建一項目...開始入坑...
具體在Android studio中怎樣配置Kotlin...就不多說了..
Android studio 配置Kotlin

step2

0.png

上圖是模塊化的項目的大致結構圖...APP為主Application的運行程序...BaseLibrary為整個應用程序的基本組件...很多第三方依賴庫和一些相關配置都在此Module中...Provider為中間件連接庫..User為用戶的登錄模塊的庫...如此的話,就將一個整體項目(只包含登錄的部分)分為四個模塊...1,主App...2,基本模塊...3,中間模塊...4,用戶登錄模塊...此時需要注意的是主App為應用程序的啟動項..其余的三個是主App所依賴的library...

step3

好了...大致的三個模塊庫已經建立完畢...那么接下來就需要將三個模塊和主App進行關聯(lián)...
Provider模塊依賴BaseLibrary..其余的模塊依賴Provider模塊..這樣所有的模塊就都有了關系...當然主App還需要在依賴User模塊...
舉個例子:--> 一家四口..Base就是爸爸...去賺錢(依賴第三方庫和一些配置),Provider就是媽媽...負責給爸爸掌管財務(依賴于BaseLibrary)...User就是長子...爸爸出門在外...給媽媽要錢,依賴著媽媽...主App就是嬰兒...爸爸不在,既需要媽媽的照顧也許要哥哥的照顧...所以主App依賴于User和Provider..

1,主App的build.gradle文件中dependencies ---->說明: 如果有和BaseLibrary中的依賴有相同此處刪掉即可,避免重復依賴...
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'

    compile project(':Provider')
    compile project(':User')
}
2,Provider中的build.gradle文件中dependencies ---->說明同上
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
    compile project(':BaseLibrary')
}
3,User中的build.gradle文件中dependencies ---->說明同上
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'

    compile project(':Provider')
}
4,BaseLibrary中的build.gradle文件中的dependencies ---> 說明: 所有的依賴的第三方的庫和文件都在Base中...此處現(xiàn)在還沒有任何依賴
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
    testCompile 'junit:junit:4.12'
}

如此就依賴好了各個模塊之間的關系...相互聯(lián)系,相互依賴..想起來白夜行...亮子和雪穗.......

step3User模塊中新建LoginActivity

xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/MathMathV"
    >

    <EditText
        android:id="@+id/mEtUserName"
        style="@style/MathWrap"
        android:layout_marginTop="20dp"
        android:hint="輸入用戶名"
        />

    <EditText
        android:id="@+id/mEtPwd"
        style="@style/MathWrap"
        android:hint="輸入密碼"
        />

    <Button
        android:id="@+id/mBtnLogin"
        style="@style/MathWrap"
        android:layout_marginTop="20dp"
        android:text="登錄"
        />
</LinearLayout>

activity代碼

class LoginActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
        mEtUserName.hint = "請輸入用戶名"
        mEtPwd.hint = "請輸入密碼"
        mBtnLogin.setOnClickListener{
            toast("點擊了注冊按鈕..")
        }
    }
}

上方activity代碼中直接用了xml中的控件Id..此處省去了butterknife的@bindView操作...用的也是Kotlin的插件..在User的build.gradle中添加一下依賴

apply plugin: 'kotlin-android-extensions'

之后sync同步即可,就可以直接用控件的id對控件進行操作,不需要再findViewById和@bindView了...
相同的是Toast的彈出事件是依賴的kotlin中的anko依賴...anko提供了四個方面的操作(經典...數(shù)據(jù)庫...布局...協(xié)程),具體請移步至github.anko

step4

將User中的build.gradle文件中的apply plugin:'com.android.library'改為apply plugin:'com.android.application'之后進行編譯同步..就會出現(xiàn)此模塊的運行名稱,之后在manifest中添加啟動項和theme主題..點擊運行即可...一來試試結果二來試試有沒有bug
2.png

運行成功...可以看到UserCenter的title..UserCenter和上文中的User是同一個Module...(請原諒我.......!!!!)

step5

搞了有那么一會兒了..運行一下吧...突然發(fā)現(xiàn)..握了個草..這怎么運行...
User是依賴庫...又不是主App...
那把User獨立成主App就好了...在User的manifest文件中添加啟動項intent-filter就好了么....
不好...還要將build.gradle中的apply plugin:'com.android.library'改為apply plugin:'com.android.application'才行
但是可能在寫的過程中,一會兒要作為主App運行,一會兒又要作為Module運行...這一會兒刪除啟動項,一會兒添加啟動項的...莫非騷年真的是意氣風發(fā),任勞任怨,勞動模范....別逗了,程序猿都是懶惰的..
在User的Module中..切換到project模式下...在main中創(chuàng)建兩個文件夾...一為debug, 一為release...之后將manifest文件拷貝兩份分別扔里面..debug時就是主App運行.release時就是模塊運行..


1.png

debug下的manifest文件代碼

<application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        >
        <activity android:name=".ui.activity.LoginActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

release下的manifest文件

<application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true">
        <activity android:name=".ui.activity.LoginActivity">
        </activity>
    </application>

至此...兩套清單文件是OK了,但是怎么樣分別在不同的情況下來使用呢...
在整體項目的gradle.properties文件中添加一句代碼,聲明一個變量

isUserModule = false

之后在User的build.gradle文件中進行兩次判斷..

if (isUserModule.toBoolean()) {
    apply plugin: 'com.android.library'          //如果isUserModule為true即為庫來運行
} else {
    apply plugin: 'com.android.application'      //否則為應用程序來運行
}

//與此同時...因為有兩套manifest文件..所以需要動態(tài)判斷使用..
sourceSets {
        main {
            if (isUserModule.toBoolean()) {
                manifest.srcFile 'src/main/release/AndroidManifest.xml' //此處需要注意的是manifest是小寫,不是大寫....
                //release模式下排除debug文件中的所有的Java文件
                java {
                    exclude 'debug/**'
                }
            } else {
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            }
        }
    }

OK...進行編譯...同步...等待...

接下來試試成果..isUserModule為true時運行....
3.png

可以看到的是,當isUserModule為true時即代表User為一個依賴庫..運行的是主App的helloworld界面...

當isUSerModule為false的時候即代表User為一個應用程序運行...運行的是登錄的界面...

寫到這里,第一步的模塊化的初始化差不多已經完成...接下來寫登錄的MVP模式和Dagger2以及RX等相關...
未完待續(xù)...

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蒙兰,隨后出現(xiàn)的幾起案子准脂,更是在濱河造成了極大的恐慌曹抬,老刑警劉巖邑雅,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惰瓜,死亡現(xiàn)場離奇詭異叠聋,居然都是意外死亡讯私,警方通過查閱死者的電腦和手機柒爸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門准浴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捎稚,你說我怎么就攤上這事乐横。” “怎么了今野?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵葡公,是天一觀的道長。 經常有香客問我腥泥,道長匾南,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任蛔外,我火速辦了婚禮蛆楞,結果婚禮上,老公的妹妹穿的比我還像新娘夹厌。我一直安慰自己豹爹,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布矛纹。 她就那樣靜靜地躺著臂聋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪或南。 梳的紋絲不亂的頭發(fā)上孩等,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音采够,去河邊找鬼肄方。 笑死,一個胖子當著我的面吹牛蹬癌,可吹牛的內容都是我干的权她。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼逝薪,長吁一口氣:“原來是場噩夢啊……” “哼隅要!你這毒婦竟也來了?” 一聲冷哼從身側響起董济,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤步清,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后感局,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尼啡,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡暂衡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了崖瞭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狂巢。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖书聚,靈堂內的尸體忽然破棺而出唧领,到底是詐尸還是另有隱情,我是刑警寧澤雌续,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布斩个,位于F島的核電站,受9級特大地震影響驯杜,放射性物質發(fā)生泄漏受啥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一鸽心、第九天 我趴在偏房一處隱蔽的房頂上張望滚局。 院中可真熱鬧,春花似錦顽频、人聲如沸藤肢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘁圈。三九已至,卻和暖如春蟀淮,著一層夾襖步出監(jiān)牢的瞬間最住,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工怠惶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留温学,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓甚疟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逃延。 傳聞我的和親對象是個殘疾皇子览妖,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容