Browse Source

废弃kotlin-android-extensions, 全部迁移到dataBinding

drake 3 years ago
parent
commit
caad18a7a4
76 changed files with 874 additions and 712 deletions
  1. 1 1
      docs/auto-dialog.md
  2. 2 2
      docs/auto-state.md
  3. 1 1
      docs/cancel.md
  4. 1 1
      docs/convert-special.md
  5. 1 1
      docs/converter.md
  6. 2 2
      docs/debounce.md
  7. 2 2
      docs/enqueue-request.md
  8. 1 1
      docs/exception-track.md
  9. 3 3
      docs/fastest.md
  10. 1 1
      docs/https.md
  11. 8 8
      docs/index.md
  12. 3 3
      docs/interval.md
  13. 1 1
      docs/kotlin-serialization.md
  14. 1 1
      docs/log-recorder.md
  15. 1 1
      docs/parallel.md
  16. 2 2
      docs/progress.md
  17. 3 3
      docs/read-cache.md
  18. 3 3
      docs/request.md
  19. 4 4
      docs/sync-request.md
  20. 1 1
      docs/tag.md
  21. 1 1
      sample/build.gradle
  22. 27 13
      sample/src/main/java/com/drake/net/sample/ui/activity/MainActivity.kt
  23. 8 7
      sample/src/main/java/com/drake/net/sample/ui/fragment/AsyncTaskFragment.kt
  24. 9 7
      sample/src/main/java/com/drake/net/sample/ui/fragment/ConfigDialogFragment.kt
  25. 8 8
      sample/src/main/java/com/drake/net/sample/ui/fragment/CoroutineScopeFragment.kt
  26. 11 14
      sample/src/main/java/com/drake/net/sample/ui/fragment/DownloadFileFragment.kt
  27. 13 10
      sample/src/main/java/com/drake/net/sample/ui/fragment/EditDebounceFragment.kt
  28. 10 8
      sample/src/main/java/com/drake/net/sample/ui/fragment/EnqueueRequestFragment.kt
  29. 9 7
      sample/src/main/java/com/drake/net/sample/ui/fragment/ErrorHandlerFragment.kt
  30. 10 7
      sample/src/main/java/com/drake/net/sample/ui/fragment/ExceptionTraceFragment.kt
  31. 10 8
      sample/src/main/java/com/drake/net/sample/ui/fragment/FastestFragment.kt
  32. 13 10
      sample/src/main/java/com/drake/net/sample/ui/fragment/HttpsCertificateFragment.kt
  33. 9 7
      sample/src/main/java/com/drake/net/sample/ui/fragment/InterceptorFragment.kt
  34. 8 5
      sample/src/main/java/com/drake/net/sample/ui/fragment/ParallelNetworkFragment.kt
  35. 9 7
      sample/src/main/java/com/drake/net/sample/ui/fragment/PullRefreshFragment.kt
  36. 10 8
      sample/src/main/java/com/drake/net/sample/ui/fragment/PushRefreshFragment.kt
  37. 10 9
      sample/src/main/java/com/drake/net/sample/ui/fragment/ReadCacheFragment.kt
  38. 18 16
      sample/src/main/java/com/drake/net/sample/ui/fragment/RequestMethodFragment.kt
  39. 10 8
      sample/src/main/java/com/drake/net/sample/ui/fragment/StateLayoutFragment.kt
  40. 16 9
      sample/src/main/java/com/drake/net/sample/ui/fragment/SuperIntervalFragment.kt
  41. 8 5
      sample/src/main/java/com/drake/net/sample/ui/fragment/SwitchDispatcherFragment.kt
  42. 10 9
      sample/src/main/java/com/drake/net/sample/ui/fragment/SyncRequestFragment.kt
  43. 11 10
      sample/src/main/java/com/drake/net/sample/ui/fragment/UniqueRequestFragment.kt
  44. 11 9
      sample/src/main/java/com/drake/net/sample/ui/fragment/UploadFileFragment.kt
  45. 10 13
      sample/src/main/java/com/drake/net/sample/ui/fragment/ViewModelRequestFragment.kt
  46. 4 2
      sample/src/main/java/com/drake/net/sample/ui/fragment/converter/BaseConvertFragment.kt
  47. 9 7
      sample/src/main/java/com/drake/net/sample/ui/fragment/converter/FastJsonConvertFragment.kt
  48. 9 8
      sample/src/main/java/com/drake/net/sample/ui/fragment/converter/GsonConvertFragment.kt
  49. 9 7
      sample/src/main/java/com/drake/net/sample/ui/fragment/converter/MoshiConvertFragment.kt
  50. 9 8
      sample/src/main/java/com/drake/net/sample/ui/fragment/converter/SerializationConvertFragment.kt
  51. 34 30
      sample/src/main/res/layout/activity_main.xml
  52. 15 11
      sample/src/main/res/layout/fragment_async_task.xml
  53. 16 12
      sample/src/main/res/layout/fragment_config_dialog.xml
  54. 15 11
      sample/src/main/res/layout/fragment_coroutine_scope.xml
  55. 24 20
      sample/src/main/res/layout/fragment_custom_convert.xml
  56. 34 30
      sample/src/main/res/layout/fragment_download_file.xml
  57. 23 19
      sample/src/main/res/layout/fragment_edit_debounce.xml
  58. 15 11
      sample/src/main/res/layout/fragment_enqueue_request.xml
  59. 15 11
      sample/src/main/res/layout/fragment_error_handler.xml
  60. 15 11
      sample/src/main/res/layout/fragment_exception_trace.xml
  61. 15 11
      sample/src/main/res/layout/fragment_fastest.xml
  62. 32 28
      sample/src/main/res/layout/fragment_https_certificate.xml
  63. 15 11
      sample/src/main/res/layout/fragment_interceptor.xml
  64. 15 11
      sample/src/main/res/layout/fragment_parallel_network.xml
  65. 14 10
      sample/src/main/res/layout/fragment_pull_refresh.xml
  66. 15 11
      sample/src/main/res/layout/fragment_push_refresh.xml
  67. 16 12
      sample/src/main/res/layout/fragment_read_cache.xml
  68. 15 11
      sample/src/main/res/layout/fragment_request_method.xml
  69. 16 12
      sample/src/main/res/layout/fragment_state_layout.xml
  70. 16 12
      sample/src/main/res/layout/fragment_super_interval.xml
  71. 15 11
      sample/src/main/res/layout/fragment_switch_dispatcher.xml
  72. 15 11
      sample/src/main/res/layout/fragment_sync_request.xml
  73. 37 33
      sample/src/main/res/layout/fragment_unique_request.xml
  74. 34 30
      sample/src/main/res/layout/fragment_upload_file.xml
  75. 4 4
      sample/src/main/res/layout/fragment_view_model_request.xml
  76. 43 39
      sample/src/main/res/layout/layout_drawer_nav_header.xml

+ 1 - 1
docs/auto-dialog.md

@@ -5,7 +5,7 @@ Net支持发起请求的时候自动弹出和关闭对话框(Loading Dialog)
 只需要使用`scopeDialog`作用域即可.
 ```kotlin
 scopeDialog {
-    tv_fragment.text = Post<String>("dialog") {
+    tvFragment.text = Post<String>("dialog") {
         param("u_name", "drake") // 请求参数
         param("pwd", "123456")
     }.await()

+ 2 - 2
docs/auto-state.md

@@ -28,7 +28,7 @@
     tools:context=".ui.fragment.StateLayoutFragment">
 
     <TextView
-        android:id="@+id/tv_fragment"
+        android:id="@+id/tvFragment"
         android:padding="32dp"
         android:textStyle="bold"
         android:layout_width="match_parent"
@@ -43,7 +43,7 @@
 ```kotlin
 state.onRefresh {
     scope {
-        tv_fragment.text = Get<String>("api").await()
+        tvFragment.text = Get<String>("api").await()
     }
 }.showLoading()
 ```

+ 1 - 1
docs/cancel.md

@@ -20,7 +20,7 @@ downloadScope.cancel() // 取消下载
 创建请求
 ```kotlin
 scopeNetLife {
-    tv_fragment.text = Get<String>("api", uid = "请求用户信息").await()
+    tvFragment.text = Get<String>("api", uid = "请求用户信息").await()
 }
 ```
 

+ 1 - 1
docs/convert-special.md

@@ -74,7 +74,7 @@ scopeNetLife {
 
 ```kotlin
 scopeNetLife {
-    tv_fragment.text = Get<List<UserModel>>("list") {
+    tvFragment.text = Get<List<UserModel>>("list") {
         converter = GsonConverter() // 单例转换器, 一般情况下是定义一个全局转换器
     }.await()[0].name
 }

+ 1 - 1
docs/converter.md

@@ -31,7 +31,7 @@ scopeNetLife {
 === "单例"
     ```kotlin hl_lines="3"
     scopeNetLife {
-        tv_fragment.text = Get<String>("api"){
+        tvFragment.text = Get<String>("api"){
             converter = SerializationConverter()
         }.await()
     }

+ 2 - 2
docs/debounce.md

@@ -20,10 +20,10 @@ var scope: CoroutineScope? = null
 et_input.debounce().listen(this) {
     scope?.cancel() // 发起新的请求前取消旧的请求, 避免旧数据覆盖新数据
     scope = scopeNetLife { // 保存旧的请求到一个变量中, scopeNetLife其函数决定网络请求生命周期
-        tv_request_content.text = "请求中"
+        tvFragment.text = "请求中"
         val data = Get<String>("http://api.k780.com/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json",
                                absolutePath = true).await()
-        tv_request_content.text = JSONObject(data).getJSONObject("result").getString("datetime_2")
+        tvFragment.text = JSONObject(data).getJSONObject("result").getString("datetime_2")
     }
 }
 ```

+ 2 - 2
docs/enqueue-request.md

@@ -25,7 +25,7 @@ Net.post("api") {
     param("password", "Net123")
 }.enqueue(object : NetCallback<String>() {
     override fun onSuccess(call: Call, data: String) {
-        tv_fragment.text = data
+        tvFragment.text = data
     }
 })
 ```
@@ -54,7 +54,7 @@ Net.post("api").onResult<String> {
 
     getOrNull()?.let { // 如果成功就不为Null
         Log.d("日志", "请求成功")
-        tv_fragment.text = it
+        tvFragment.text = it
     }
 
     exceptionOrNull()?.apply {

+ 1 - 1
docs/exception-track.md

@@ -7,7 +7,7 @@ Net中网络请求导致的异常都会在LogCat中打印, 同时被全局的Net
 ```kotlin
 scopeNetLife {
     // 这是一个错误的地址, 请查看LogCat的错误信息, 在[Convert]中你也可以进行自定义错误信息打印
-    tv_fragment.text = Get<String>("error").await()
+    tvFragment.text = Get<String>("error").await()
 }
 ```
 

+ 3 - 3
docs/fastest.md

@@ -14,7 +14,7 @@ scopeNetLife {
     val deferred3 = Post<String>("api")
 
     // 只返回最快的请求结果
-    tv_fragment.text = fastSelect(deferred, deferred1, deferred2, deferred3)
+    tvFragment.text = fastSelect(deferred, deferred1, deferred2, deferred3)
 }
 ```
 
@@ -32,7 +32,7 @@ scopeNetLife {
     val deferred1 = Get<String>("api1") { setGroup("最快") } // 错误接口
 
     // 只返回最快的请求结果
-    tv_fragment.text = fastest(listOf(deferred, deferred1, deferred2, deferred3), "最快")
+    tvFragment.text = fastest(listOf(deferred, deferred1, deferred2, deferred3), "最快")
 }
 ```
 
@@ -60,7 +60,7 @@ scopeNetLife {
         it
     }
 
-    tv_fragment.text = fastest(fastest, fastest2)
+    tvFragment.text = fastest(fastest, fastest2)
 }
 ```
 

+ 1 - 1
docs/https.md

@@ -8,7 +8,7 @@ Https如果是使用的CA颁发的证书, 不需要任何配置Net可以直接
 
 ```kotlin
 scopeNetLife {
-    tv_fragment.text = Get<String>("https://github.com/").await()
+    tvFragment.text = Get<String>("https://github.com/").await()
 }
 ```
 

+ 8 - 8
docs/index.md

@@ -76,14 +76,14 @@ Net支持RestFul设计风格
 
 ```kotlin
 scopeNetLife {
-    tv_fragment.text = Get<String>("http://www.baidu.com/").await()
-    tv_fragment.text = Post<String>("http://www.baidu.com/").await()
-    tv_fragment.text = Head<String>("http://www.baidu.com/").await()
-    tv_fragment.text = Put<String>("http://www.baidu.com/").await()
-    tv_fragment.text = Patch<String>("http://www.baidu.com/").await()
-    tv_fragment.text = Delete<String>("http://www.baidu.com/").await()
-    tv_fragment.text = Trace<String>("http://www.baidu.com/").await()
-    tv_fragment.text = Options<String>("http://www.baidu.com/").await()
+    tvFragment.text = Get<String>("http://www.baidu.com/").await()
+    tvFragment.text = Post<String>("http://www.baidu.com/").await()
+    tvFragment.text = Head<String>("http://www.baidu.com/").await()
+    tvFragment.text = Put<String>("http://www.baidu.com/").await()
+    tvFragment.text = Patch<String>("http://www.baidu.com/").await()
+    tvFragment.text = Delete<String>("http://www.baidu.com/").await()
+    tvFragment.text = Trace<String>("http://www.baidu.com/").await()
+    tvFragment.text = Options<String>("http://www.baidu.com/").await()
 }
 ```
 

+ 3 - 3
docs/interval.md

@@ -17,9 +17,9 @@
 监听轮循器
 ```kotlin
 interval.subscribe {
-    tv_fragment.text = it.toString()
+    tvFragment.text = it.toString()
 }.finish {
-    tv_fragment.text = "计时完成" // 最后一位数时同时回调 subscribe/finish
+    tvFragment.text = "计时完成" // 最后一位数时同时回调 subscribe/finish
 }.start()
 ```
 
@@ -37,7 +37,7 @@ interval.stop() // 停止
 
 ```kotlin
 interval.life(this).subscribe { // 添加一个life函数即可
-    tv_fragment.text = it.toString()
+    tvFragment.text = it.toString()
 }
 ```
 

+ 1 - 1
docs/kotlin-serialization.md

@@ -46,7 +46,7 @@ scopeNetLife {
         converter = SerializationConvert() // 单例转换器, 此时会忽略全局转换器
     }.await()
 
-    tv_fragment.text = userList[0].name
+    tvFragment.text = userList[0].name
 }
 ```
 

+ 1 - 1
docs/log-recorder.md

@@ -54,7 +54,7 @@ NetConfig.init("http://github.com/") {
 
 ```kotlin
 scopeNetLife {
-    tv_fragment.text = Get<String>("api") {
+    tvFragment.text = Get<String>("api") {
         setLogRecord(false) // 为当前请求禁用日志记录
     }.await()
 }

+ 1 - 1
docs/parallel.md

@@ -12,7 +12,7 @@ Net在2.0开始引入协程来支持并发和异步, 虽然很多网络框架支
 val job = scopeNetLife {
     repeat(10000) {
         // 这里将返回的数据显示在TextView上
-        tv_fragment.text = Get<String>("http://www.baidu.com/").await()
+        tvFragment.text = Get<String>("http://www.baidu.com/").await()
     }
 }
 ```

+ 2 - 2
docs/progress.md

@@ -11,7 +11,7 @@ scopeNetLife {
             override fun onProgress(p: Progress) {
                 seek.post {
                     seek.progress = p.progress()
-                    tv_progress.text =
+                    tvProgress.text =
                         "上传进度: ${p.progress()}% 上传速度: ${p.speedSize()}     " +
                                 "\n\n文件大小: ${p.totalSize()}  已上传: ${p.currentSize()}  剩余大小: ${p.remainSize()}" +
                                 "\n\n已使用时间: ${p.useTime()}  剩余时间: ${p.remainTime()}"
@@ -38,7 +38,7 @@ scopeNetLife {
                     seek?.post {
                         val progress = p.progress()
                         seek.progress = progress
-                        tv_progress.text =
+                        tvProgress.text =
                             "下载进度: $progress% 下载速度: ${p.speedSize()}     " +
                                     "\n\n文件大小: ${p.totalSize()}  已下载: ${p.currentSize()}  剩余大小: ${p.remainSize()}" +
                                     "\n\n已使用时间: ${p.useTime()}  剩余时间: ${p.remainTime()}"

+ 3 - 3
docs/read-cache.md

@@ -12,7 +12,7 @@ NetConfig.init("http://github.com/") {
     ```kotlin
     scopeNetLife {
         // 先读取缓存, 如果缓存不存在再请求网络
-        tv_fragment.text = Get<String>("api", cache = CacheMode.READ_CACHE_NO_THEN_NETWORK).await()
+        tvFragment.text = Get<String>("api", cache = CacheMode.READ_CACHE_NO_THEN_NETWORK).await()
         Log.d("日志", "读取缓存")
     }
     ```
@@ -21,11 +21,11 @@ NetConfig.init("http://github.com/") {
     ```kotlin
     scopeNetLife {
         // 然后执行这里(网络请求)
-        tv_fragment.text = Post<String>("api", cache = CacheMode.NETWORK_YES_THEN_WRITE_CACHE).await()
+        tvFragment.text = Post<String>("api", cache = CacheMode.NETWORK_YES_THEN_WRITE_CACHE).await()
         Log.d("日志", "网络请求")
     }.preview {
         // 先执行这里(仅读缓存), 任何异常都视为读取缓存失败
-        tv_fragment.text = Get<String>("api", cache = CacheMode.READ_CACHE).await()
+        tvFragment.text = Get<String>("api", cache = CacheMode.READ_CACHE).await()
         Log.d("日志", "读取缓存")
     }
     ```

+ 3 - 3
docs/request.md

@@ -62,7 +62,7 @@ scopeNetLife { // 创建作用域
     val measurements = listOf(100, 100, 100)
 
     scopeNetLife {
-        tv_fragment.text = Post<String>("api") {
+        tvFragment.text = Post<String>("api") {
             json("name" to name, "age" to age, "measurements" to measurements) // 同时也支持Map集合
         }.await()
     }
@@ -75,7 +75,7 @@ scopeNetLife { // 创建作用域
     val measurements = listOf(100, 100, 100)
 
     scopeNetLife {
-        tv_fragment.text = Post<String>("api") {
+        tvFragment.text = Post<String>("api") {
             json(JSONObject().run {
                 put("name", name)
                 put("age", age)
@@ -92,7 +92,7 @@ scopeNetLife { // 创建作用域
     val measurements = listOf(100, 100, 100)
 
     scopeNetLife {
-        tv_fragment.text = Post<String>("api") {
+        tvFragment.text = Post<String>("api") {
             body = MyJsonBody(name, age, measurements)
         }.await()
     }

+ 4 - 4
docs/sync-request.md

@@ -7,8 +7,8 @@ Net支持在当前线程执行, 会阻塞当前线程的同步请求 -- `execute
     ```kotlin
     thread {
         val result = Net.post("api").execute<String>() // 网络请求不允许在主线程
-        tv_fragment?.post {
-            tv_fragment?.text = result  // view要求在主线程更新
+        tvFragment?.post {
+            tvFragment?.text = result  // view要求在主线程更新
         }
     }
     ```
@@ -17,8 +17,8 @@ Net支持在当前线程执行, 会阻塞当前线程的同步请求 -- `execute
     ```kotlin
     thread {
         val result = Net.post("api").toResult<String>().getOrDefault("请求发生错误, 我这是默认值")
-        tv_fragment?.post {
-            tv_fragment?.text = result  // view要求在主线程更新
+        tvFragment?.post {
+            tvFragment?.text = result  // view要求在主线程更新
         }
     }
     ```

+ 1 - 1
docs/tag.md

@@ -12,7 +12,7 @@ Net中的标签同时支持使用字符串或者Class字节码作为标签的键
 
 ```kotlin hl_lines="2"
 scopeNetLife {
-    tv_fragment.text = Get<String>("api", "标签A"){ // 使用Any::class.java作为键名
+    tvFragment.text = Get<String>("api", "标签A"){ // 使用Any::class.java作为键名
         setTag("tagName", "标签B") // 使用字符串作为键名
     }.await()
 }

+ 1 - 1
sample/build.gradle

@@ -16,7 +16,6 @@
 
 apply plugin: "com.android.application"
 apply plugin: "kotlin-android"
-apply plugin: "kotlin-android-extensions"
 apply plugin: "kotlin-kapt"
 apply plugin: 'kotlinx-serialization'
 
@@ -98,6 +97,7 @@ dependencies {
     implementation 'com.github.liangjingkanji:StatusBar:1.1.1' // 透明状态栏
     implementation 'com.github.liangjingkanji:debugkit:1.2.11' // 开发调试窗口工具
     implementation "com.github.liangjingkanji:Tooltip:1.1.2" // 吐司工具
+    implementation 'com.github.liangjingkanji:Engine:0.0.25'
 
     // ------------------------------Google数据库-------------------------------------
     implementation "androidx.room:room-runtime:$room_version"

+ 27 - 13
sample/src/main/java/com/drake/net/sample/ui/activity/MainActivity.kt

@@ -16,31 +16,45 @@
 
 package com.drake.net.sample.ui.activity
 
-import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
 import androidx.core.view.GravityCompat
-import androidx.navigation.fragment.findNavController
+import androidx.navigation.findNavController
 import androidx.navigation.ui.AppBarConfiguration
 import androidx.navigation.ui.setupWithNavController
+import com.drake.engine.base.EngineActivity
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.ActivityMainBinding
 import com.drake.statusbar.immersive
-import kotlinx.android.synthetic.main.activity_main.*
 
 /**
  * 以下代码设置导航, 和框架本身无关无需关心, 请查看[com.drake.net.sample.ui.fragment]内的Fragment
  */
-class MainActivity : AppCompatActivity(R.layout.activity_main) {
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        immersive(toolbar, true)
-        setSupportActionBar(toolbar)
-        toolbar.setupWithNavController(nav.findNavController(), AppBarConfiguration(nav_view.menu, drawer))
-        nav_view.setupWithNavController(nav.findNavController())
+class MainActivity : EngineActivity<ActivityMainBinding>(R.layout.activity_main) {
+
+    override fun initView() {
+        immersive(binding.toolbar, true)
+        setSupportActionBar(binding.toolbar)
+        // val actionBarDrawerToggle = ActionBarDrawerToggle(
+        //     this,
+        //     binding.drawer,
+        //     binding.toolbar,
+        //     R.string.app_name,
+        //     R.string.app_name
+        // )
+        // binding.drawer.addDrawerListener(actionBarDrawerToggle)
+        // actionBarDrawerToggle.syncState()
+        val navController = findNavController(R.id.nav)
+        binding.toolbar.setupWithNavController(
+            navController,
+            AppBarConfiguration(binding.drawerNav.menu, binding.drawer)
+        )
+        binding.drawerNav.setupWithNavController(navController)
+    }
+
+    override fun initData() {
     }
 
     override fun onBackPressed() {
-        if (drawer.isDrawerOpen(GravityCompat.START)) drawer.closeDrawers() else super.onBackPressed()
+        if (binding.drawer.isDrawerOpen(GravityCompat.START)) binding.drawer.closeDrawers() else super.onBackPressed()
     }
 }
 

+ 8 - 7
sample/src/main/java/com/drake/net/sample/ui/fragment/AsyncTaskFragment.kt

@@ -16,25 +16,26 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentAsyncTaskBinding
 import com.drake.net.utils.scope
-import kotlinx.android.synthetic.main.fragment_async_task.*
 import kotlinx.coroutines.*
 
-class AsyncTaskFragment : Fragment(R.layout.fragment_async_task) {
+class AsyncTaskFragment : EngineFragment<FragmentAsyncTaskBinding>(R.layout.fragment_async_task) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initView() {
         scope {
-            tv_fragment.text = withContext(Dispatchers.IO) {
+            binding.tvFragment.text = withContext(Dispatchers.IO) {
                 delay(2000)
                 "结果"
             }
         }
     }
 
+    override fun initData() {
+    }
+
     /**
      * 抽出异步任务为一个函数
      */

+ 9 - 7
sample/src/main/java/com/drake/net/sample/ui/fragment/ConfigDialogFragment.kt

@@ -16,22 +16,21 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Post
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentConfigDialogBinding
 import com.drake.net.utils.scopeDialog
 import com.drake.tooltip.toast
-import kotlinx.android.synthetic.main.fragment_config_dialog.*
 import kotlinx.coroutines.CancellationException
 
 
-class ConfigDialogFragment : Fragment(R.layout.fragment_config_dialog) {
+class ConfigDialogFragment :
+    EngineFragment<FragmentConfigDialogBinding>(R.layout.fragment_config_dialog) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initView() {
         scopeDialog {
-            tv_fragment.text = Post<String>("dialog") {
+            binding.tvFragment.text = Post<String>("dialog") {
                 param("u_name", "drake")
                 param("pwd", "123456")
             }.await()
@@ -42,4 +41,7 @@ class ConfigDialogFragment : Fragment(R.layout.fragment_config_dialog) {
             }
         }
     }
+
+    override fun initData() {
+    }
 }

+ 8 - 8
sample/src/main/java/com/drake/net/sample/ui/fragment/CoroutineScopeFragment.kt

@@ -16,22 +16,20 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
 import androidx.lifecycle.Lifecycle
+import com.drake.engine.base.EngineFragment
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentCoroutineScopeBinding
 import com.drake.net.utils.scope
 import com.drake.net.utils.scopeLife
 import com.drake.net.utils.scopeNet
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_coroutine_scope.*
 import kotlinx.coroutines.delay
 
 
-class CoroutineScopeFragment : Fragment(R.layout.fragment_coroutine_scope) {
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+class CoroutineScopeFragment :
+    EngineFragment<FragmentCoroutineScopeBinding>(R.layout.fragment_coroutine_scope) {
+    override fun initData() {
         // 其作用域在应用进程销毁时才会被动取消
         scope {
 
@@ -40,7 +38,7 @@ class CoroutineScopeFragment : Fragment(R.layout.fragment_coroutine_scope) {
         // 其作用域在Activity或者Fragment销毁(onDestroy)时被动取消 [scopeNetLife]
         scopeLife {
             delay(2000)
-            tv_fragment.text = "任务结束"
+            binding.tvFragment.text = "任务结束"
         }
 
         // 自定义取消跟随的生命周期, 失去焦点时立即取消作用域
@@ -59,4 +57,6 @@ class CoroutineScopeFragment : Fragment(R.layout.fragment_coroutine_scope) {
         }
     }
 
+    override fun initView() {
+    }
 }

+ 11 - 14
sample/src/main/java/com/drake/net/sample/ui/fragment/DownloadFileFragment.kt

@@ -16,33 +16,27 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.util.Log
 import android.view.Menu
 import android.view.MenuInflater
 import android.view.MenuItem
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Get
 import com.drake.net.component.Progress
 import com.drake.net.interfaces.ProgressListener
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentDownloadFileBinding
 import com.drake.net.scope.NetCoroutineScope
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_download_file.*
 import java.io.File
-import kotlin.time.ExperimentalTime
 
 
-class DownloadFileFragment : Fragment(R.layout.fragment_download_file) {
+class DownloadFileFragment :
+    EngineFragment<FragmentDownloadFileBinding>(R.layout.fragment_download_file) {
 
     private lateinit var downloadScope: NetCoroutineScope
 
-    @ExperimentalTime
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initView() {
         setHasOptionsMenu(true)
-
-
         downloadScope = scopeNetLife {
             val file =
                 Get<File>("https://download.sublimetext.com/Sublime%20Text%20Build%203211.dmg") {
@@ -52,10 +46,10 @@ class DownloadFileFragment : Fragment(R.layout.fragment_download_file) {
                     setDownloadTempFile()
                     addDownloadListener(object : ProgressListener() {
                         override fun onProgress(p: Progress) {
-                            seek?.post {
+                            binding.seek?.post {
                                 val progress = p.progress()
-                                seek.progress = progress
-                                tv_progress.text =
+                                binding.seek.progress = progress
+                                binding.tvProgress.text =
                                     "下载进度: $progress% 下载速度: ${p.speedSize()}     " +
                                             "\n\n文件大小: ${p.totalSize()}  已下载: ${p.currentSize()}  剩余大小: ${p.remainSize()}" +
                                             "\n\n已使用时间: ${p.useTime()}  剩余时间: ${p.remainTime()}"
@@ -77,4 +71,7 @@ class DownloadFileFragment : Fragment(R.layout.fragment_download_file) {
         }
         return super.onOptionsItemSelected(item)
     }
+
+    override fun initData() {
+    }
 }

+ 13 - 10
sample/src/main/java/com/drake/net/sample/ui/fragment/EditDebounceFragment.kt

@@ -1,30 +1,33 @@
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Get
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentEditDebounceBinding
 import com.drake.net.utils.debounce
 import com.drake.net.utils.listen
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_edit_debounce.*
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.cancel
 import org.json.JSONObject
 
-class EditDebounceFragment : Fragment(R.layout.fragment_edit_debounce) {
+class EditDebounceFragment :
+    EngineFragment<FragmentEditDebounceBinding>(R.layout.fragment_edit_debounce) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initData() {
+    }
 
+    override fun initView() {
         var scope: CoroutineScope? = null
 
-        et_input.debounce().listen(this) {
+        binding.etInput.debounce().listen(this) {
             scope?.cancel() // 发起新的请求前取消旧的请求, 避免旧数据覆盖新数据
             scope = scopeNetLife { // 保存旧的请求到一个变量中
-                tv_request_content.text = "请求中"
-                val data = Get<String>("http://api.k780.com/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json").await()
-                tv_request_content.text = JSONObject(data).getJSONObject("result").getString("datetime_2")
+                binding.tvFragment.text = "请求中"
+                val data =
+                    Get<String>("http://api.k780.com/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json").await()
+                binding.tvFragment.text =
+                    JSONObject(data).getJSONObject("result").getString("datetime_2")
             }
         }
     }

+ 10 - 8
sample/src/main/java/com/drake/net/sample/ui/fragment/EnqueueRequestFragment.kt

@@ -1,16 +1,18 @@
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
 import android.util.Log
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Net
 import com.drake.net.sample.R
-import kotlinx.android.synthetic.main.fragment_fastest.*
+import com.drake.net.sample.databinding.FragmentEnqueueRequestBinding
 
-class EnqueueRequestFragment : Fragment(R.layout.fragment_enqueue_request) {
+class EnqueueRequestFragment :
+    EngineFragment<FragmentEnqueueRequestBinding>(R.layout.fragment_enqueue_request) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initData() {
+    }
+
+    override fun initView() {
 
         // Net同样支持OkHttp的队列任务
 
@@ -27,7 +29,7 @@ class EnqueueRequestFragment : Fragment(R.layout.fragment_enqueue_request) {
         //     param("password", "Net123")
         // }.enqueue(object : NetCallback<String>() {
         //     override fun onSuccess(call: Call, result: String) {
-        //         tv_fragment.text = result // onSuccess 属于主线程
+        //         binding.tvFragment.text = result // onSuccess 属于主线程
         //     }
         // })
 
@@ -36,7 +38,7 @@ class EnqueueRequestFragment : Fragment(R.layout.fragment_enqueue_request) {
 
             getOrNull()?.let { // 如果成功就不为Null
                 Log.d("日志", "请求成功")
-                tv_fragment.text = it
+                binding.tvFragment.text = it
             }
 
             exceptionOrNull()?.apply {

+ 9 - 7
sample/src/main/java/com/drake/net/sample/ui/fragment/ErrorHandlerFragment.kt

@@ -16,25 +16,27 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Get
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentErrorHandlerBinding
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_error_handler.*
 
 
-class ErrorHandlerFragment : Fragment(R.layout.fragment_error_handler) {
+class ErrorHandlerFragment :
+    EngineFragment<FragmentErrorHandlerBinding>(R.layout.fragment_error_handler) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initView() {
         scopeNetLife {
             // 该请求是错误的路径会在控制台打印出错误信息
             Get<String>("error").await()
         }.catch {
             // 重写该函数后, 错误不会流到[NetConfig.onError]中的全局错误处理, 在App.kt中可以自定义该全局处理, 同时包含onStateError
-            tv_fragment.text = it.message
+            binding.tvFragment.text = it.message
         }
     }
 
+    override fun initData() {
+    }
+
 }

+ 10 - 7
sample/src/main/java/com/drake/net/sample/ui/fragment/ExceptionTraceFragment.kt

@@ -16,22 +16,25 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Get
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentExceptionTraceBinding
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_exception_trace.*
 
 
-class ExceptionTraceFragment : Fragment(R.layout.fragment_exception_trace) {
+class ExceptionTraceFragment :
+    EngineFragment<FragmentExceptionTraceBinding>(R.layout.fragment_exception_trace) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initView() {
         scopeNetLife {
             // 这是一个错误的地址, 请查看LogCat的错误信息, 在[initNet]函数中的[onError]回调中你也可以进行自定义错误信息打印
-            tv_fragment.text = Get<String>("https://githuberror.com/liangjingkanji/Net/").await()
+            binding.tvFragment.text =
+                Get<String>("https://githuberror.com/liangjingkanji/Net/").await()
         }
     }
 
+    override fun initData() {
+    }
+
 }

+ 10 - 8
sample/src/main/java/com/drake/net/sample/ui/fragment/FastestFragment.kt

@@ -16,19 +16,17 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Get
 import com.drake.net.Post
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentFastestBinding
 import com.drake.net.utils.fastest
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_request_method.*
 
-class FastestFragment : Fragment(R.layout.fragment_fastest) {
+class FastestFragment : EngineFragment<FragmentFastestBinding>(R.layout.fragment_fastest) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initView() {
         scopeNetLife {
             /*
             网络请求的取消本质上依靠uid来辨别,如果设置[uid]参数可以在返回最快结果后取消掉其他网络请求, 反之不会取消其他网络请求
@@ -42,7 +40,8 @@ class FastestFragment : Fragment(R.layout.fragment_fastest) {
             val deferred1 = Get<String>("api1") { setGroup("最快") } // 错误接口
 
             // 只返回最快的请求结果
-            tv_fragment.text = fastest(listOf(deferred, deferred1, deferred2, deferred3), "最快")
+            binding.tvFragment.text =
+                fastest(listOf(deferred, deferred1, deferred2, deferred3), "最快")
         }
 
         /*
@@ -63,7 +62,10 @@ class FastestFragment : Fragment(R.layout.fragment_fastest) {
         //     }
         //
         //     // 只返回最快的请求结果
-        //     tv_fragment.text = fastest(requestList).toString()
+        //     binding.tvFragment.text = fastest(requestList).toString()
         // }
     }
+
+    override fun initData() {
+    }
 }

+ 13 - 10
sample/src/main/java/com/drake/net/sample/ui/fragment/HttpsCertificateFragment.kt

@@ -1,29 +1,32 @@
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
 import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Get
 import com.drake.net.okhttp.setSSLCertificate
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentHttpsCertificateBinding
 import com.drake.net.utils.scopeNetLife
 import com.drake.tooltip.toast
-import kotlinx.android.synthetic.main.fragment_https_certificate.*
 import okhttp3.OkHttpClient
 
-class HttpsCertificateFragment : Fragment(R.layout.fragment_https_certificate) {
+class HttpsCertificateFragment :
+    EngineFragment<FragmentHttpsCertificateBinding>(R.layout.fragment_https_certificate) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        btn_trust_certificate.setOnClickListener(this::trustAllCertificate)
-        btn_import_certificate.setOnClickListener(this::importCertificate)
+    override fun initView() {
+        binding.btnTrustCertificate.setOnClickListener(this::trustAllCertificate)
+        binding.btnImportCertificate.setOnClickListener(this::importCertificate)
+    }
+
+    override fun initData() {
     }
 
     /**
      * 信任全部证书
      */
-    fun trustAllCertificate(view: View) {
+    private fun trustAllCertificate(view: View) {
         scopeNetLife {
-            tv_response.text = Get<String>("https://github.com/") {
+            binding.tvResponse.text = Get<String>("https://github.com/") {
                 okHttpClient = OkHttpClient.Builder().build()
             }.await()
         }
@@ -32,7 +35,7 @@ class HttpsCertificateFragment : Fragment(R.layout.fragment_https_certificate) {
     /**
      * 导入私有证书
      */
-    fun importCertificate(view: View) {
+    private fun importCertificate(view: View) {
         scopeNetLife {
             Get<String>("https://github.com/") {
                 setClient {

+ 9 - 7
sample/src/main/java/com/drake/net/sample/ui/fragment/InterceptorFragment.kt

@@ -16,23 +16,25 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Get
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentInterceptorBinding
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_exception_trace.*
 
 
-class InterceptorFragment : Fragment(R.layout.fragment_interceptor) {
+class InterceptorFragment :
+    EngineFragment<FragmentInterceptorBinding>(R.layout.fragment_interceptor) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initView() {
         scopeNetLife {
-            tv_fragment.text = Get<String>("api") {
+            binding.tvFragment.text = Get<String>("api") {
                 // 拦截器只支持全局, 无法单例, 请查看[com.drake.net.sample.interceptor.NetInterceptor]
             }.await()
         }
     }
 
+    override fun initData() {
+    }
+
 }

+ 8 - 5
sample/src/main/java/com/drake/net/sample/ui/fragment/ParallelNetworkFragment.kt

@@ -16,19 +16,19 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Get
 import com.drake.net.Post
 import com.drake.net.Trace
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentParallelNetworkBinding
 import com.drake.net.utils.scopeNetLife
 
 
-class ParallelNetworkFragment : Fragment(R.layout.fragment_parallel_network) {
+class ParallelNetworkFragment :
+    EngineFragment<FragmentParallelNetworkBinding>(R.layout.fragment_parallel_network) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initView() {
         scopeNetLife {
 
             // 同时发起三个请求
@@ -43,4 +43,7 @@ class ParallelNetworkFragment : Fragment(R.layout.fragment_parallel_network) {
         }
     }
 
+    override fun initData() {
+    }
+
 }

+ 9 - 7
sample/src/main/java/com/drake/net/sample/ui/fragment/PullRefreshFragment.kt

@@ -16,19 +16,18 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.setup
+import com.drake.engine.base.EngineFragment
 import com.drake.net.sample.R
-import kotlinx.android.synthetic.main.fragment_pull_refresh.*
+import com.drake.net.sample.databinding.FragmentPullRefreshBinding
 
 
-class PullRefreshFragment : Fragment(R.layout.fragment_pull_refresh) {
+class PullRefreshFragment :
+    EngineFragment<FragmentPullRefreshBinding>(R.layout.fragment_pull_refresh) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        rv_pull.linear().setup {
+    override fun initView() {
+        binding.rv.linear().setup {
             addType<String>(R.layout.item_list)
         }
 
@@ -44,4 +43,7 @@ class PullRefreshFragment : Fragment(R.layout.fragment_pull_refresh) {
         // }.autoRefresh()
     }
 
+    override fun initData() {
+    }
+
 }

+ 10 - 8
sample/src/main/java/com/drake/net/sample/ui/fragment/PushRefreshFragment.kt

@@ -16,28 +16,30 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.setup
+import com.drake.engine.base.EngineFragment
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentPushRefreshBinding
 import com.drake.net.utils.scope
-import kotlinx.android.synthetic.main.fragment_push_refresh.*
 
 
-class PushRefreshFragment : Fragment(R.layout.fragment_push_refresh) {
+class PushRefreshFragment :
+    EngineFragment<FragmentPushRefreshBinding>(R.layout.fragment_push_refresh) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        rv_push.linear().setup {
+    override fun initView() {
+        binding.rv.linear().setup {
             addType<String>(R.layout.item_list)
         }
 
-        page.onRefresh {
+        binding.page.onRefresh {
             scope {
                 // rv_push.models = Get<ListModel>("list").await().data.list
             }
         }.autoRefresh()
     }
 
+    override fun initData() {
+    }
+
 }

+ 10 - 9
sample/src/main/java/com/drake/net/sample/ui/fragment/ReadCacheFragment.kt

@@ -16,30 +16,31 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
 import android.util.Log
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Get
 import com.drake.net.Post
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentReadCacheBinding
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_read_cache.*
 
 
-class ReadCacheFragment : Fragment(R.layout.fragment_read_cache) {
+class ReadCacheFragment : EngineFragment<FragmentReadCacheBinding>(R.layout.fragment_read_cache) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initView() {
         scopeNetLife {
             // 然后执行这里(网络请求)
-            tv_fragment.text =
-                    Post<String>("api").await()
+            binding.tvFragment.text =
+                Post<String>("api").await()
             Log.d("日志", "网络请求")
         }.preview {
             // 先执行这里(仅读缓存), 任何异常都视为读取缓存失败
-            tv_fragment.text = Get<String>("api").await()
+            binding.tvFragment.text = Get<String>("api").await()
             Log.d("日志", "读取缓存")
         }
     }
 
+    override fun initData() {
+    }
+
 }

+ 18 - 16
sample/src/main/java/com/drake/net/sample/ui/fragment/RequestMethodFragment.kt

@@ -18,69 +18,71 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
 import android.view.Menu
 import android.view.MenuInflater
 import android.view.MenuItem
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.*
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentRequestMethodBinding
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_async_task.*
 
 
-class RequestMethodFragment : Fragment(R.layout.fragment_request_method) {
+class RequestMethodFragment :
+    EngineFragment<FragmentRequestMethodBinding>(R.layout.fragment_request_method) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initView() {
         setHasOptionsMenu(true)
     }
 
+    override fun initData() {
+    }
+
     private fun GET() {
         scopeNetLife {
-            tv_fragment.text = Get<String>("api").await()
+            binding.tvFragment.text = Get<String>("api").await()
         }
     }
 
     private fun POST() {
         scopeNetLife {
-            tv_fragment.text = Post<String>("api").await()
+            binding.tvFragment.text = Post<String>("api").await()
         }
     }
 
     private fun HEAD() {
         scopeNetLife {
-            tv_fragment.text = Head<String>("api").await()
+            binding.tvFragment.text = Head<String>("api").await()
         }
     }
 
     private fun PUT() {
         scopeNetLife {
-            tv_fragment.text = Put<String>("api").await()
+            binding.tvFragment.text = Put<String>("api").await()
         }
     }
 
     private fun PATCH() {
         scopeNetLife {
-            tv_fragment.text = Patch<String>("api").await()
+            binding.tvFragment.text = Patch<String>("api").await()
         }
     }
 
     private fun DELETE() {
         scopeNetLife {
-            tv_fragment.text = Delete<String>("api").await()
+            binding.tvFragment.text = Delete<String>("api").await()
         }
     }
 
     private fun TRACE() {
         scopeNetLife {
-            tv_fragment.text = Trace<String>("api").await()
+            binding.tvFragment.text = Trace<String>("api").await()
         }
     }
 
     private fun OPTIONS() {
         scopeNetLife {
-            tv_fragment.text = Options<String>("api").await()
+            binding.tvFragment.text = Options<String>("api").await()
         }
     }
 
@@ -96,7 +98,7 @@ class RequestMethodFragment : Fragment(R.layout.fragment_request_method) {
         scopeNetLife {
 
             // 创建JSONObject对象
-            // tv_fragment.text = Post<String>("api") {
+            // binding.tvFragment.text = Post<String>("api") {
             //     json(JSONObject().run {
             //         put("name", name)
             //         put("age", age)
@@ -105,7 +107,7 @@ class RequestMethodFragment : Fragment(R.layout.fragment_request_method) {
             // }.await()
 
             // 创建JSON
-            tv_fragment.text = Post<String>("api") {
+            binding.tvFragment.text = Post<String>("api") {
                 json("name" to name, "age" to age, "measurements" to measurements) // 同时支持Map集合
             }.await()
         }

+ 10 - 8
sample/src/main/java/com/drake/net/sample/ui/fragment/StateLayoutFragment.kt

@@ -16,21 +16,23 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Get
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentStateLayoutBinding
 import com.drake.net.utils.scope
-import kotlinx.android.synthetic.main.fragment_state_layout.*
 
 
-class StateLayoutFragment : Fragment(R.layout.fragment_state_layout) {
+class StateLayoutFragment :
+    EngineFragment<FragmentStateLayoutBinding>(R.layout.fragment_state_layout) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        state.onRefresh {
+    override fun initData() {
+    }
+
+    override fun initView() {
+        binding.state.onRefresh {
             scope {
-                tv_fragment.text = Get<String>("api").await()
+                binding.tvFragment.text = Get<String>("api").await()
             }
         }.showLoading()
     }

+ 16 - 9
sample/src/main/java/com/drake/net/sample/ui/fragment/SuperIntervalFragment.kt

@@ -16,32 +16,39 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
 import android.view.Menu
 import android.view.MenuInflater
 import android.view.MenuItem
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentSuperIntervalBinding
 import com.drake.net.time.Interval
-import kotlinx.android.synthetic.main.fragment_super_interval.*
 import java.util.concurrent.TimeUnit
 
 
-class SuperIntervalFragment : Fragment(R.layout.fragment_super_interval) {
+class SuperIntervalFragment :
+    EngineFragment<FragmentSuperIntervalBinding>(R.layout.fragment_super_interval) {
 
     private lateinit var interval: Interval // 轮循器
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        interval = Interval(0, 1, TimeUnit.SECONDS, 10).life(this) // 自定义计数器个数的轮循器, 当[start]]比[end]值大, 且end不等于-1时, 即为倒计时
+    override fun initView() {
+        interval = Interval(
+            0,
+            1,
+            TimeUnit.SECONDS,
+            10
+        ).life(this) // 自定义计数器个数的轮循器, 当[start]]比[end]值大, 且end不等于-1时, 即为倒计时
         // interval = Interval(1, TimeUnit.SECONDS) // 每秒回调一次, 不会自动结束
         interval.subscribe {
-            tv_fragment.text = it.toString()
+            binding.tvFragment.text = it.toString()
         }.finish {
-            tv_fragment.text = "计时完成"
+            binding.tvFragment.text = "计时完成"
         }.start()
     }
 
+    override fun initData() {
+    }
+
     override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
         super.onCreateOptionsMenu(menu, inflater)
         inflater.inflate(R.menu.menu_interval, menu)

+ 8 - 5
sample/src/main/java/com/drake/net/sample/ui/fragment/SwitchDispatcherFragment.kt

@@ -16,19 +16,19 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentSwitchDispatcherBinding
 import com.drake.net.utils.scopeLife
 import com.drake.net.utils.withIO
 import com.drake.net.utils.withMain
 import kotlinx.coroutines.launch
 
 
-class SwitchDispatcherFragment : Fragment(R.layout.fragment_switch_dispatcher) {
+class SwitchDispatcherFragment :
+    EngineFragment<FragmentSwitchDispatcherBinding>(R.layout.fragment_switch_dispatcher) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initView() {
         scopeLife {
 
             // 点击函数名查看更多相关函数
@@ -44,4 +44,7 @@ class SwitchDispatcherFragment : Fragment(R.layout.fragment_switch_dispatcher) {
         }
     }
 
+    override fun initData() {
+    }
+
 }

+ 10 - 9
sample/src/main/java/com/drake/net/sample/ui/fragment/SyncRequestFragment.kt

@@ -1,23 +1,24 @@
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Net
 import com.drake.net.sample.R
-import kotlinx.android.synthetic.main.fragment_sync_request.*
+import com.drake.net.sample.databinding.FragmentSyncRequestBinding
 import kotlin.concurrent.thread
 
-class SyncRequestFragment : Fragment(R.layout.fragment_sync_request) {
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+class SyncRequestFragment :
+    EngineFragment<FragmentSyncRequestBinding>(R.layout.fragment_sync_request) {
 
+    override fun initView() {
         thread {
             val result = Net.post("api").execute<String>() // 网络请求不允许在主线程
             // val result = Net.post("api").toResult<String>().getOrDefault("请求发生错误, 我这是默认值")
-            tv_fragment?.post {
-                tv_fragment?.text = result  // view要求在主线程更新
+            binding.tvFragment?.post {
+                binding.tvFragment?.text = result  // view要求在主线程更新
             }
         }
     }
+
+    override fun initData() {
+    }
 }

+ 11 - 10
sample/src/main/java/com/drake/net/sample/ui/fragment/UniqueRequestFragment.kt

@@ -1,30 +1,31 @@
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
 import android.util.Log
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Post
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentUniqueRequestBinding
 import com.drake.net.scope.AndroidScope
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_unique_request.*
 
-class UniqueRequestFragment : Fragment(R.layout.fragment_unique_request) {
+class UniqueRequestFragment :
+    EngineFragment<FragmentUniqueRequestBinding>(R.layout.fragment_unique_request) {
 
     private var scope: AndroidScope? = null
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-
-        btn_request.setOnClickListener {
-            tv_result.text = "请求中"
+    override fun initView() {
+        binding.btnRequest.setOnClickListener {
+            binding.tvResult.text = "请求中"
             scope?.cancel() // 如果存在则取消
 
             scope = scopeNetLife {
                 val result = Post<String>("api").await()
                 Log.d("日志", "请求到结果") // 你一直重复点击"发起请求"按钮会发现永远无法拿到请求结果, 因为每次发起新的请求会取消未完成的
-                tv_result.text = result
+                binding.tvResult.text = result
             }
         }
     }
+
+    override fun initData() {
+    }
 }

+ 11 - 9
sample/src/main/java/com/drake/net/sample/ui/fragment/UploadFileFragment.kt

@@ -16,32 +16,31 @@
 
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.Fragment
+import com.drake.engine.base.EngineFragment
 import com.drake.net.Post
 import com.drake.net.component.Progress
 import com.drake.net.interfaces.ProgressListener
 import com.drake.net.sample.R
+import com.drake.net.sample.databinding.FragmentUploadFileBinding
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_upload_file.*
 import okio.buffer
 import okio.sink
 import okio.source
 import java.io.File
 
 
-class UploadFileFragment : Fragment(R.layout.fragment_upload_file) {
+class UploadFileFragment :
+    EngineFragment<FragmentUploadFileBinding>(R.layout.fragment_upload_file) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+    override fun initView() {
         scopeNetLife {
             Post<String>("https://download.sublimetext.com/Sublime%20Text%20Build%203211.dmg") {
                 param("file", assetsFile())
                 addUploadListener(object : ProgressListener() {
                     override fun onProgress(p: Progress) {
-                        seek.post {
-                            seek.progress = p.progress()
-                            tv_progress.text =
+                        binding.seek.post {
+                            binding.seek.progress = p.progress()
+                            binding.tvProgress.text =
                                 "上传进度: ${p.progress()}% 上传速度: ${p.speedSize()}     " +
                                         "\n\n文件大小: ${p.totalSize()}  已上传: ${p.currentSize()}  剩余大小: ${p.remainSize()}" +
                                         "\n\n已使用时间: ${p.useTime()}  剩余时间: ${p.remainTime()}"
@@ -61,4 +60,7 @@ class UploadFileFragment : Fragment(R.layout.fragment_upload_file) {
         }
         return file
     }
+
+    override fun initData() {
+    }
 }

+ 10 - 13
sample/src/main/java/com/drake/net/sample/ui/fragment/ViewModelRequestFragment.kt

@@ -1,29 +1,26 @@
 package com.drake.net.sample.ui.fragment
 
-import android.os.Bundle
-import android.view.View
-import androidx.databinding.DataBindingUtil
-import androidx.fragment.app.Fragment
 import androidx.fragment.app.viewModels
+import com.drake.engine.base.EngineFragment
 import com.drake.net.sample.R
 import com.drake.net.sample.databinding.FragmentViewModelRequestBinding
 import com.drake.net.sample.model.UserViewModel
-import kotlinx.android.synthetic.main.fragment_view_model_request.*
 
-class ViewModelRequestFragment : Fragment(R.layout.fragment_view_model_request) {
+class ViewModelRequestFragment :
+    EngineFragment<FragmentViewModelRequestBinding>(R.layout.fragment_view_model_request) {
 
     private val userViewModel: UserViewModel by viewModels() // 创建ViewModel
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-
-        // 绑定DataBinding
-        val bind = DataBindingUtil.bind<FragmentViewModelRequestBinding>(view)!!
-        bind.lifecycleOwner = this
-        bind.m = userViewModel
+    override fun initView() {
+        binding.lifecycleOwner = this
+        binding.m = userViewModel
 
         // 动作开始拉取服务器数据
-        btn_fetch_userinfo.setOnClickListener {
+        binding.btnFetchUserinfo.setOnClickListener {
             userViewModel.fetchUserInfo()
         }
     }
+
+    override fun initData() {
+    }
 }

+ 4 - 2
sample/src/main/java/com/drake/net/sample/ui/fragment/converter/BaseConvertFragment.kt

@@ -5,12 +5,14 @@ import android.view.Menu
 import android.view.MenuInflater
 import android.view.MenuItem
 import androidx.annotation.LayoutRes
-import androidx.fragment.app.Fragment
+import androidx.databinding.ViewDataBinding
 import androidx.navigation.fragment.findNavController
 import androidx.navigation.ui.onNavDestinationSelected
+import com.drake.engine.base.EngineFragment
 import com.drake.net.sample.R
 
-open class BaseConvertFragment(@LayoutRes contentLayoutId: Int = 0) : Fragment(contentLayoutId) {
+abstract class BaseConvertFragment<T : ViewDataBinding>(@LayoutRes contentLayoutId: Int = 0) :
+    EngineFragment<T>(contentLayoutId) {
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)

+ 9 - 7
sample/src/main/java/com/drake/net/sample/ui/fragment/converter/FastJsonConvertFragment.kt

@@ -16,29 +16,31 @@
 
 package com.drake.net.sample.ui.fragment.converter
 
-import android.os.Bundle
-import android.view.View
 import com.drake.net.Get
 import com.drake.net.sample.R
 import com.drake.net.sample.converter.FastJsonConverter
+import com.drake.net.sample.databinding.FragmentCustomConvertBinding
 import com.drake.net.sample.model.Model
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_custom_convert.*
 
 
-class FastJsonConvertFragment : BaseConvertFragment(R.layout.fragment_custom_convert) {
+class FastJsonConvertFragment :
+    BaseConvertFragment<FragmentCustomConvertBinding>(R.layout.fragment_custom_convert) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        tv_convert_tip.text = """
+    override fun initView() {
+        binding.tvConvertTip.text = """
             1. 阿里巴巴出品的Json解析库
             2. 引入kotlin-reflect库可以支持kotlin默认值
         """.trimIndent()
 
         scopeNetLife {
-            tv_fragment.text = Get<Model>("api") {
+            binding.tvFragment.text = Get<Model>("api") {
                 converter = FastJsonConverter() // 单例转换器, 此时会忽略全局转换器
             }.await().data.request_method
         }
     }
 
+    override fun initData() {
+    }
+
 }

+ 9 - 8
sample/src/main/java/com/drake/net/sample/ui/fragment/converter/GsonConvertFragment.kt

@@ -16,21 +16,19 @@
 
 package com.drake.net.sample.ui.fragment.converter
 
-import android.os.Bundle
-import android.view.View
 import com.drake.net.Get
 import com.drake.net.sample.R
 import com.drake.net.sample.converter.GsonConverter
-import com.drake.net.sample.model.Model
+import com.drake.net.sample.databinding.FragmentCustomConvertBinding
 import com.drake.net.sample.model.UserModel
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_custom_convert.*
 
 
-class GsonConvertFragment : BaseConvertFragment(R.layout.fragment_custom_convert) {
+class GsonConvertFragment :
+    BaseConvertFragment<FragmentCustomConvertBinding>(R.layout.fragment_custom_convert) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        tv_convert_tip.text = """
+    override fun initView() {
+        binding.tvConvertTip.text = """
             1. Google官方出品
             2. Json解析库Java上的老牌解析库
             3. 不支持Kotlin构造参数默认值
@@ -38,10 +36,13 @@ class GsonConvertFragment : BaseConvertFragment(R.layout.fragment_custom_convert
         """.trimIndent()
 
         scopeNetLife {
-            tv_fragment.text = Get<List<UserModel>>("list") {
+            binding.tvFragment.text = Get<List<UserModel>>("list") {
                 converter = GsonConverter() // 单例转换器, 此时会忽略全局转换器, 在Net中可以直接解析List等嵌套泛型数据
             }.await()[0].name
         }
     }
 
+    override fun initData() {
+    }
+
 }

+ 9 - 7
sample/src/main/java/com/drake/net/sample/ui/fragment/converter/MoshiConvertFragment.kt

@@ -16,20 +16,19 @@
 
 package com.drake.net.sample.ui.fragment.converter
 
-import android.os.Bundle
-import android.view.View
 import com.drake.net.Get
 import com.drake.net.sample.R
 import com.drake.net.sample.converter.MoshiConverter
+import com.drake.net.sample.databinding.FragmentCustomConvertBinding
 import com.drake.net.sample.model.Model
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_custom_convert.*
 
 
-class MoshiConvertFragment : BaseConvertFragment(R.layout.fragment_custom_convert) {
+class MoshiConvertFragment :
+    BaseConvertFragment<FragmentCustomConvertBinding>(R.layout.fragment_custom_convert) {
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        tv_convert_tip.text = """
+    override fun initView() {
+        binding.tvConvertTip.text = """
             1. Square出品的JSON解析库
             2. 支持Kotlin构造默认值
             3. 具备注解和反射两种使用方式
@@ -38,9 +37,12 @@ class MoshiConvertFragment : BaseConvertFragment(R.layout.fragment_custom_conver
         """.trimIndent()
 
         scopeNetLife {
-            tv_fragment.text = Get<Model>("api") {
+            binding.tvFragment.text = Get<Model>("api") {
                 converter = MoshiConverter() // 单例转换器, 此时会忽略全局转换器
             }.await().data.request_method
         }
     }
+
+    override fun initData() {
+    }
 }

+ 9 - 8
sample/src/main/java/com/drake/net/sample/ui/fragment/converter/SerializationConvertFragment.kt

@@ -16,20 +16,18 @@
 
 package com.drake.net.sample.ui.fragment.converter
 
-import android.os.Bundle
-import android.view.View
 import com.drake.net.Get
 import com.drake.net.sample.R
 import com.drake.net.sample.converter.SerializationConverter
+import com.drake.net.sample.databinding.FragmentCustomConvertBinding
 import com.drake.net.sample.model.UserModel
 import com.drake.net.utils.scopeNetLife
-import kotlinx.android.synthetic.main.fragment_custom_convert.*
 
+class SerializationConvertFragment :
+    BaseConvertFragment<FragmentCustomConvertBinding>(R.layout.fragment_custom_convert) {
 
-class SerializationConvertFragment : BaseConvertFragment(R.layout.fragment_custom_convert) {
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        tv_convert_tip.text = """
+    override fun initView() {
+        binding.tvConvertTip.text = """
             1. kotlin官方出品, 推荐使用 
             2. kotlinx.serialization 是Kotlin上是最完美的序列化工具 
             3. 支持多种反序列化数据类型Pair/枚举/Map...
@@ -44,8 +42,11 @@ class SerializationConvertFragment : BaseConvertFragment(R.layout.fragment_custo
                 converter = SerializationConverter() // 单例转换器, 此时会忽略全局转换器
             }.await()
 
-            tv_fragment.text = userList[0].name
+            binding.tvFragment.text = userList[0].name
         }
     }
 
+    override fun initData() {
+    }
+
 }

+ 34 - 30
sample/src/main/res/layout/activity_main.xml

@@ -16,42 +16,46 @@
   ~ limitations under the License.
   -->
 
-<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/drawer"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
 
 
-    <LinearLayout
+    <androidx.drawerlayout.widget.DrawerLayout
+        android:id="@+id/drawer"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="vertical">
+        android:layout_height="match_parent">
 
-        <androidx.appcompat.widget.Toolbar
-            android:id="@+id/toolbar"
-            android:background="@color/windowBackground"
-            app:navigationIcon="@drawable/ic_menu"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content" />
 
-        <fragment
-            android:id="@+id/nav"
-            android:name="androidx.navigation.fragment.NavHostFragment"
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            app:defaultNavHost="false"
-            app:navGraph="@navigation/nav_main" />
-
-    </LinearLayout>
-
-    <com.google.android.material.navigation.NavigationView
-        android:id="@+id/nav_view"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_gravity="start"
-        app:headerLayout="@layout/layout_drawer_nav_header"
-        app:menu="@menu/menu_main" />
+            android:orientation="vertical">
+
+            <androidx.appcompat.widget.Toolbar
+                android:id="@+id/toolbar"
+                android:background="@color/windowBackground"
+                app:navigationIcon="@drawable/ic_menu"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+
+            <fragment
+                android:id="@+id/nav"
+                android:name="androidx.navigation.fragment.NavHostFragment"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                app:defaultNavHost="false"
+                app:navGraph="@navigation/nav_main" />
+
+        </LinearLayout>
+
+        <com.google.android.material.navigation.NavigationView
+            android:id="@+id/drawerNav"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_gravity="start"
+            app:headerLayout="@layout/layout_drawer_nav_header"
+            app:menu="@menu/menu_main" />
 
-</androidx.drawerlayout.widget.DrawerLayout>
+    </androidx.drawerlayout.widget.DrawerLayout>
+</layout>
 

+ 15 - 11
sample/src/main/res/layout/fragment_async_task.xml

@@ -14,18 +14,22 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.AsyncTaskFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="center"
-        android:textStyle="bold"
-        android:text="等待2秒" />
+        tools:context=".ui.fragment.AsyncTaskFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textStyle="bold"
+            android:text="等待2秒" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 16 - 12
sample/src/main/res/layout/fragment_config_dialog.xml

@@ -14,19 +14,23 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.ConfigDialogFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_margin="16dp"
-        android:gravity="center"
-        android:text="等待数据中"
-        android:textStyle="bold" />
+        tools:context=".ui.fragment.ConfigDialogFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_margin="16dp"
+            android:gravity="center"
+            android:text="等待数据中"
+            android:textStyle="bold" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 15 - 11
sample/src/main/res/layout/fragment_coroutine_scope.xml

@@ -14,18 +14,22 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.CoroutineScopeFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="center"
-        android:textStyle="bold"
-        android:text="等待2秒" />
+        tools:context=".ui.fragment.CoroutineScopeFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textStyle="bold"
+            android:text="等待2秒" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 24 - 20
sample/src/main/res/layout/fragment_custom_convert.xml

@@ -14,28 +14,32 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.converter.GsonConvertFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_convert_tip"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_vertical"
-        android:minHeight="50dp"
-        android:paddingHorizontal="20dp"
-        android:textSize="12dp"
-        tools:text="推荐, kotlinx.serialization支持任何泛型, 可直接返回Map/List/Pair..." />
 
-    <TextView
-        android:id="@+id/tv_fragment"
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="center"
-        android:text="等待请求完成"
-        android:textStyle="bold" />
+        tools:context=".ui.fragment.converter.GsonConvertFragment">
+
+        <TextView
+            android:id="@+id/tvConvertTip"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:minHeight="50dp"
+            android:paddingHorizontal="20dp"
+            android:textSize="12dp"
+            tools:text="推荐, kotlinx.serialization支持任何泛型, 可直接返回Map/List/Pair..." />
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:text="等待请求完成"
+            android:textStyle="bold" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 34 - 30
sample/src/main/res/layout/fragment_download_file.xml

@@ -14,38 +14,42 @@
   ~ limitations under the License.
   -->
 
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<layout 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"
-    tools:context=".ui.fragment.DownloadFileFragment">
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <SeekBar
-        android:id="@+id/seek"
+
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_margin="16dp"
-        android:gravity="center"
-        android:text="等待下载完成"
-        android:textSize="18dp"
-        android:textStyle="bold"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintVertical_bias="0.5" />
+        android:layout_height="match_parent"
+        tools:context=".ui.fragment.DownloadFileFragment">
+
+        <SeekBar
+            android:id="@+id/seek"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="16dp"
+            android:gravity="center"
+            android:text="等待下载完成"
+            android:textSize="18dp"
+            android:textStyle="bold"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintVertical_bias="0.5" />
 
-    <TextView
-        android:id="@+id/tv_progress"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="16dp"
-        android:layout_marginHorizontal="16dp"
-        android:textSize="12dp"
-        app:layout_constraintLeft_toLeftOf="@id/seek"
-        app:layout_constraintRight_toRightOf="@id/seek"
-        app:layout_constraintTop_toBottomOf="@id/seek"
-        tools:text="下载进度: 90%" />
+        <TextView
+            android:id="@+id/tvProgress"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:layout_marginHorizontal="16dp"
+            android:textSize="12dp"
+            app:layout_constraintLeft_toLeftOf="@id/seek"
+            app:layout_constraintRight_toRightOf="@id/seek"
+            app:layout_constraintTop_toBottomOf="@id/seek"
+            tools:text="下载进度: 90%" />
 
-</androidx.constraintlayout.widget.ConstraintLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>

+ 23 - 19
sample/src/main/res/layout/fragment_edit_debounce.xml

@@ -1,25 +1,29 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    tools:context=".ui.fragment.EditDebounceFragment">
-
-    <EditText
-        android:id="@+id/et_input"
-        android:layout_width="match_parent"
-        android:layout_height="50dp"
-        android:layout_marginHorizontal="32dp"
-        android:layout_marginTop="20dp"
-        android:hint="输入内容将自动查询当前时间" />
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
 
-    <TextView
-        android:id="@+id/tv_request_content"
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_margin="32dp"
-        android:textStyle="bold" />
+        android:orientation="vertical"
+        tools:context=".ui.fragment.EditDebounceFragment">
+
+        <EditText
+            android:id="@+id/etInput"
+            android:layout_width="match_parent"
+            android:layout_height="50dp"
+            android:layout_marginHorizontal="32dp"
+            android:layout_marginTop="20dp"
+            android:hint="输入内容将自动查询当前时间" />
+
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_margin="32dp"
+            android:textStyle="bold" />
 
-</LinearLayout>
+    </LinearLayout>
+</layout>

+ 15 - 11
sample/src/main/res/layout/fragment_enqueue_request.xml

@@ -1,16 +1,20 @@
 <?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.EnqueueRequestFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="center"
-        android:textStyle="bold"
-        android:text="等待2秒" />
+        tools:context=".ui.fragment.EnqueueRequestFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textStyle="bold"
+            android:text="等待2秒" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 15 - 11
sample/src/main/res/layout/fragment_error_handler.xml

@@ -14,18 +14,22 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.ErrorHandlerFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="center"
-        android:textStyle="bold"
-        android:text="LogCat查看请求返回的错误信息" />
+        tools:context=".ui.fragment.ErrorHandlerFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textStyle="bold"
+            android:text="LogCat查看请求返回的错误信息" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 15 - 11
sample/src/main/res/layout/fragment_exception_trace.xml

@@ -14,18 +14,22 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.ExceptionTraceFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="center"
-        android:textStyle="bold"
-        android:text="查看控制台" />
+        tools:context=".ui.fragment.ExceptionTraceFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textStyle="bold"
+            android:text="查看控制台" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 15 - 11
sample/src/main/res/layout/fragment_fastest.xml

@@ -14,18 +14,22 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.FastestFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="center"
-        android:textStyle="bold"
-        android:text="请求结果显示" />
+        tools:context=".ui.fragment.FastestFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textStyle="bold"
+            android:text="请求结果显示" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 32 - 28
sample/src/main/res/layout/fragment_https_certificate.xml

@@ -1,33 +1,37 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:gravity="center"
-    android:orientation="vertical"
-    tools:context=".ui.fragment.HttpsCertificateFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <Button
-        android:id="@+id/btn_trust_certificate"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="信任所有证书" />
 
-    <Button
-        android:id="@+id/btn_import_certificate"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="导入证书" />
-
-    <TextView
-        android:id="@+id/tv_response"
-        android:scrollbars="vertical"
+    <androidx.appcompat.widget.LinearLayoutCompat
         android:layout_width="match_parent"
-        android:layout_height="400dp"
-        android:layout_marginHorizontal="20dp"
-        android:layout_marginTop="20dp"
-        android:maxLines="300"
-        android:background="@color/divider"
-        android:padding="8dp" />
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:orientation="vertical"
+        tools:context=".ui.fragment.HttpsCertificateFragment">
+
+        <Button
+            android:id="@+id/btn_trust_certificate"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="信任所有证书" />
+
+        <Button
+            android:id="@+id/btn_import_certificate"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="导入证书" />
+
+        <TextView
+            android:id="@+id/tvResponse"
+            android:scrollbars="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="400dp"
+            android:layout_marginHorizontal="20dp"
+            android:layout_marginTop="20dp"
+            android:maxLines="300"
+            android:background="@color/divider"
+            android:padding="8dp" />
 
-</androidx.appcompat.widget.LinearLayoutCompat>
+    </androidx.appcompat.widget.LinearLayoutCompat>
+</layout>

+ 15 - 11
sample/src/main/res/layout/fragment_interceptor.xml

@@ -14,18 +14,22 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.InterceptorFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="center"
-        android:textStyle="bold"
-        android:text="拦截器仅支持全局" />
+        tools:context=".ui.fragment.InterceptorFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textStyle="bold"
+            android:text="拦截器仅支持全局" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 15 - 11
sample/src/main/res/layout/fragment_parallel_network.xml

@@ -14,18 +14,22 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.ParallelNetworkFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="center"
-        android:textStyle="bold"
-        android:text="查看Demo源码" />
+        tools:context=".ui.fragment.ParallelNetworkFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textStyle="bold"
+            android:text="查看Demo源码" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 14 - 10
sample/src/main/res/layout/fragment_pull_refresh.xml

@@ -14,16 +14,20 @@
   ~ limitations under the License.
   -->
 
-<com.drake.brv.PageRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/page"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.PullRefreshFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <androidx.recyclerview.widget.RecyclerView
-        android:id="@+id/rv_pull"
+
+    <com.drake.brv.PageRefreshLayout
+        android:id="@+id/page"
         android:layout_width="match_parent"
-        android:layout_height="match_parent" />
+        android:layout_height="match_parent"
+        tools:context=".ui.fragment.PullRefreshFragment">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rv"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
 
-</com.drake.brv.PageRefreshLayout>
+    </com.drake.brv.PageRefreshLayout>
+</layout>

+ 15 - 11
sample/src/main/res/layout/fragment_push_refresh.xml

@@ -14,18 +14,22 @@
   ~ limitations under the License.
   -->
 
-<com.drake.brv.PageRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/page"
-    android:layout_width="match_parent"
-    app:srlEnableLoadMore="false"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.PushRefreshFragment">
+    xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <androidx.recyclerview.widget.RecyclerView
-        android:id="@+id/rv_push"
+
+    <com.drake.brv.PageRefreshLayout
+        android:id="@+id/page"
         android:layout_width="match_parent"
-        android:layout_height="match_parent" />
+        app:srlEnableLoadMore="false"
+        android:layout_height="match_parent"
+        tools:context=".ui.fragment.PushRefreshFragment">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rv"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
 
-</com.drake.brv.PageRefreshLayout>
+    </com.drake.brv.PageRefreshLayout>
+</layout>

+ 16 - 12
sample/src/main/res/layout/fragment_read_cache.xml

@@ -14,19 +14,23 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.ReadCacheFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
-        android:padding="16dp"
         android:layout_height="match_parent"
-        android:textStyle="bold"
-        android:gravity="center"
-        android:text="仅请求成功一次后才会存在缓存" />
+        tools:context=".ui.fragment.ReadCacheFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:padding="16dp"
+            android:layout_height="match_parent"
+            android:textStyle="bold"
+            android:gravity="center"
+            android:text="仅请求成功一次后才会存在缓存" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 15 - 11
sample/src/main/res/layout/fragment_request_method.xml

@@ -14,18 +14,22 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.RequestMethodFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="center"
-        android:textStyle="bold"
-        android:text="点击右上角菜单开始请求" />
+        tools:context=".ui.fragment.RequestMethodFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textStyle="bold"
+            android:text="点击右上角菜单开始请求" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 16 - 12
sample/src/main/res/layout/fragment_state_layout.xml

@@ -14,19 +14,23 @@
   ~ limitations under the License.
   -->
 
-<com.drake.statelayout.StateLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:id="@+id/state"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.StateLayoutFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
-        android:padding="32dp"
-        android:textStyle="bold"
+
+    <com.drake.statelayout.StateLayout
         android:layout_width="match_parent"
+        android:id="@+id/state"
         android:layout_height="match_parent"
-        android:text="内容" />
+        tools:context=".ui.fragment.StateLayoutFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:padding="32dp"
+            android:textStyle="bold"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:text="内容" />
 
-</com.drake.statelayout.StateLayout>
+    </com.drake.statelayout.StateLayout>
+</layout>

+ 16 - 12
sample/src/main/res/layout/fragment_super_interval.xml

@@ -14,19 +14,23 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.SuperIntervalFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="center"
-        android:textSize="32dp"
-        tools:text="0"
-        android:textStyle="bold" />
+        tools:context=".ui.fragment.SuperIntervalFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textSize="32dp"
+            tools:text="0"
+            android:textStyle="bold" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 15 - 11
sample/src/main/res/layout/fragment_switch_dispatcher.xml

@@ -14,18 +14,22 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.SwitchDispatcherFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="center"
-        android:textStyle="bold"
-        android:text="查看Demo源码" />
+        tools:context=".ui.fragment.SwitchDispatcherFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textStyle="bold"
+            android:text="查看Demo源码" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 15 - 11
sample/src/main/res/layout/fragment_sync_request.xml

@@ -1,16 +1,20 @@
 <?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".ui.fragment.SyncRequestFragment">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
-        android:id="@+id/tv_fragment"
+
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="center"
-        android:textStyle="bold"
-        android:text="等待2秒" />
+        tools:context=".ui.fragment.SyncRequestFragment">
+
+        <TextView
+            android:id="@+id/tvFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textStyle="bold"
+            android:text="等待2秒" />
 
-</FrameLayout>
+    </FrameLayout>
+</layout>

+ 37 - 33
sample/src/main/res/layout/fragment_unique_request.xml

@@ -1,40 +1,44 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<layout 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"
-    tools:context=".ui.fragment.UniqueRequestFragment">
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <TextView
+
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:layout_height="50dp"
-        android:gravity="center_vertical"
-        android:paddingHorizontal="16dp"
-        android:text="重复发起相同网络请求时, 取消上次未完成请求"
-        android:textSize="12dp"
-        app:layout_constraintTop_toTopOf="parent" />
+        android:layout_height="match_parent"
+        tools:context=".ui.fragment.UniqueRequestFragment">
 
-    <Button
-        android:id="@+id/btn_request"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:text="发起请求"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="50dp"
+            android:gravity="center_vertical"
+            android:paddingHorizontal="16dp"
+            android:text="重复发起相同网络请求时, 取消上次未完成请求"
+            android:textSize="12dp"
+            app:layout_constraintTop_toTopOf="parent" />
 
-    <TextView
-        android:id="@+id/tv_result"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="32dp"
-        android:gravity="center"
-        android:paddingHorizontal="16dp"
-        android:textColor="@color/black"
-        app:layout_constraintTop_toBottomOf="@id/btn_request"
-        tools:text="请求结果" />
+        <Button
+            android:id="@+id/btnRequest"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:text="发起请求"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/tvResult"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="32dp"
+            android:gravity="center"
+            android:paddingHorizontal="16dp"
+            android:textColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/btnRequest"
+            tools:text="请求结果" />
 
-</androidx.constraintlayout.widget.ConstraintLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>

+ 34 - 30
sample/src/main/res/layout/fragment_upload_file.xml

@@ -14,38 +14,42 @@
   ~ limitations under the License.
   -->
 
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<layout 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"
-    tools:context=".ui.fragment.UploadFileFragment">
+    xmlns:tools="http://schemas.android.com/tools">
 
-    <SeekBar
-        android:id="@+id/seek"
+
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_margin="16dp"
-        android:gravity="center"
-        android:text="等待下载完成"
-        android:textSize="18dp"
-        android:textStyle="bold"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintVertical_bias="0.5" />
+        android:layout_height="match_parent"
+        tools:context=".ui.fragment.UploadFileFragment">
+
+        <SeekBar
+            android:id="@+id/seek"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="16dp"
+            android:gravity="center"
+            android:text="等待下载完成"
+            android:textSize="18dp"
+            android:textStyle="bold"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintVertical_bias="0.5" />
 
-    <TextView
-        android:id="@+id/tv_progress"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginHorizontal="16dp"
-        android:layout_marginTop="16dp"
-        android:textSize="12dp"
-        app:layout_constraintLeft_toLeftOf="@id/seek"
-        app:layout_constraintRight_toRightOf="@id/seek"
-        app:layout_constraintTop_toBottomOf="@id/seek"
-        tools:text="上传进度: 90%   上传速度: 20MB/s" />
+        <TextView
+            android:id="@+id/tvProgress"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginHorizontal="16dp"
+            android:layout_marginTop="16dp"
+            android:textSize="12dp"
+            app:layout_constraintLeft_toLeftOf="@id/seek"
+            app:layout_constraintRight_toRightOf="@id/seek"
+            app:layout_constraintTop_toBottomOf="@id/seek"
+            tools:text="上传进度: 90%   上传速度: 20MB/s" />
 
-</androidx.constraintlayout.widget.ConstraintLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>

+ 4 - 4
sample/src/main/res/layout/fragment_view_model_request.xml

@@ -18,22 +18,22 @@
         tools:context=".ui.fragment.ViewModelRequestFragment">
 
         <Button
-            android:id="@+id/btn_fetch_userinfo"
+            android:id="@+id/btnFetchUserinfo"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="拉取用户信息" />
 
         <TextView
-            android:id="@+id/tv_response"
+            android:id="@+id/tvResponse"
             android:layout_width="match_parent"
             android:layout_height="400dp"
             android:layout_marginHorizontal="20dp"
             android:layout_marginTop="20dp"
-            android:text="@{m.userInfo}"
             android:background="@color/divider"
             android:maxLines="300"
             android:padding="8dp"
-            android:scrollbars="vertical" />
+            android:scrollbars="vertical"
+            android:text="@{m.userInfo}" />
 
     </LinearLayout>
 </layout>

+ 43 - 39
sample/src/main/res/layout/layout_drawer_nav_header.xml

@@ -14,46 +14,50 @@
   ~ limitations under the License.
   -->
 
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_height="240dp">
-
-    <LinearLayout
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        android:layout_marginTop="24dp"
-        android:gravity="center"
-        app:layout_constraintBottom_toBottomOf="parent"
-        android:layout_width="wrap_content"
-        android:orientation="vertical"
-        android:layout_height="wrap_content">
-
-        <ImageView
-            android:layout_width="100dp"
-            android:layout_height="100dp"
-            android:id="@+id/iv"
-            android:src="@drawable/header" />
-
-        <TextView
-            android:id="@+id/tv_name"
-            android:layout_width="wrap_content"
-            android:text="刘强东"
-            android:textSize="16dp"
-            android:textStyle="bold"
-            android:layout_marginTop="16dp"
-            android:layout_height="wrap_content" />
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="240dp">
 
-        <TextView
+        <LinearLayout
             android:layout_width="wrap_content"
-            android:layout_marginTop="8dp"
-            android:textSize="12dp"
-            android:autoLink="web"
-            android:textStyle="italic"
-            android:text="liangjingkanji.github.io/Net/"
-            android:layout_height="wrap_content" />
+            android:layout_height="wrap_content"
+            android:layout_marginTop="24dp"
+            android:gravity="center"
+            android:orientation="vertical"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <ImageView
+                android:id="@+id/iv"
+                android:layout_width="100dp"
+                android:layout_height="100dp"
+                android:src="@drawable/header" />
+
+            <TextView
+                android:id="@+id/tvName"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp"
+                android:text="刘强东"
+                android:textSize="16dp"
+                android:textStyle="bold" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="8dp"
+                android:autoLink="web"
+                android:text="liangjingkanji.github.io/Net/"
+                android:textSize="12dp"
+                android:textStyle="italic" />
 
-    </LinearLayout>
+        </LinearLayout>
 
-</androidx.constraintlayout.widget.ConstraintLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>