1. 程式人生 > >將原生android專案轉換為kotlin時遇到的問題

將原生android專案轉換為kotlin時遇到的問題

程式碼重構過程遇到的問題

  1. 對於Fragment,只有在onCreateView方法執行完畢後才能直接通過id引用佈局檔案中的控制元件

  2. 同時使用DataBinding框架和Kotlin導致的錯誤【解決方案連結】

    Error:(x, x) Unresolved reference: databinding
    
  3. 定製Glide的全域性載入配置時,需要建立一個類繼承AppGlideModule。然後使用GlideApp而不是Glide去載入圖片。我在某個Kotlin檔案中同時使用了Glide框架後,當MakeProject時,報錯:找不到GlideApp。也就是編譯時沒有生成該類。解決方法,修改build.gradle檔案

    【解決方案連結】

    implementation 'com.github.bumptech.glide:glide:4.4.0'
    kapt 'com.github.bumptech.glide:compiler:4.4.0'
  4. 在Java程式碼和Kotlin程式碼中混合使用ButteeKnife框架時,建議修改build.gradle檔案中ButterKnife的註釋生成器

    implementation 'com.jakewharton:butterknife:8.8.1'
    kapt 'com.jakewharton:butterknife-compiler:8.8.1'
  5. kotlin+Lamada+RxJava的一些程式碼精簡過程

    //原始版本
    .subscribe(object : Subscriber<ZhihuThemeList>() {
       override fun onNext(t: ZhihuThemeList?) {}
       override fun onCompleted(){}
       override fun onError(e: Throwable?) {}
    })
    
    //精簡版 +
    .subscribe(object : Action1<ZhihuThemeList>{
      override fun call(t:ZhihuThemeList?){}
    })
    
    //精簡版 ++  (匿名內部類或者介面只有一個待實現的方法,可使用Lambda表示式)
    .subscribe{ data -> mAdapter?.setmDataSet(data) } //精簡版 +++ (如果無需重新命名唯一待實現的方法的引數(引數只有一個),可省略引數宣告直接用it表示) .subscribe { mAdapter?.setmDataSet(it) }
  6. RecycleView中Databinding+Kotlin的具體應用

    ①首先寫一個通用的工具類Util.kt
import android.databinding.DataBindingUtil
import android.databinding.ViewDataBinding
import android.support.annotation.LayoutRes
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

/**
 * 通用的ViewHolder類,由於使用了DataBinding框架所以無需使用ButterKnife框架進行@BindView的宣告
 */
class CommonViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)


/**
 * 返回ViewHolder的簡便的拓展方法
 */
fun <T : ViewDataBinding> ViewGroup.inflate(@LayoutRes layoutRes: Int, attachToParent: Boolean = false): CommonViewHolder {
    return CommonViewHolder(DataBindingUtil.inflate<T>(LayoutInflater.from(context), layoutRes, this, attachToParent).root)
}
②在其它自定義的RecycleViewAdapter中的應用

class MenuAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    companion object {
        private val TYPE_TOP = 0
        private val TYPE_NOT_TOP = 1
    }
    ... //省略一部分程式碼
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
            when (viewType) {
                TYPE_TOP -> parent.inflate<TopItemMenuRecycleviewBinding>(R.layout.top_item_menu_recycleview)
                else -> parent.inflate<ItemLeftMenuRecycleviewBinding>(R.layout.item_left_menu_recycleview)
            }

}