2015-12-18 61 views
2

主要問題是:lparams簡單地從Anko走了,還是我在做一些非常錯誤的事情?下面的代碼片斷編譯失敗:Anko 0.8 - 未解決的lparams參考

verticalLayout { 
}.lparams(width = matchParent, height = matchParent) { 
    topMargin = dip(10) 
} 

雖然這個工作沒有任何問題:

verticalLayout { 
    layoutParams = LinearLayout.LayoutParams(matchParent, matchParent).apply { 
     topMargin = dip(10) 
    } 
} 

我不會介意的第二個選項太多,但你必須指定生成時的佈局類型params,這可能會讓人感到厭煩(也比原來的解決方案更脆弱)。

我還沒有在Anko GitHub頁面上找到任何東西,更新日誌,或者通過瀏覽最近的提交。下面是引用完整的UI類:

class ReviewsFragmentUi(ctx: AnkoContext<ReviewsFragment>) : AnkoComponent<ReviewsFragment> { 
    override fun createView(ui: AnkoContext<ReviewsFragment>) = ui.apply { 
     verticalLayout { 
      layoutParams = LinearLayout.LayoutParams(matchParent, matchParent).apply { 
       topMargin = dip(10) 
      } 
     } 
    }.view 
} 

相關搖籃項(我使用科特林1.0.0-β-3595):

ext.versions = [ 
    anko : '0.8.1', 
] 

compile "org.jetbrains.anko:anko-common:$versions.anko", 
compile "org.jetbrains.anko:anko-sdk21:$versions.anko", 
compile "org.jetbrains.anko:anko-support-v4:$versions.anko", 
compile "org.jetbrains.anko:anko-design:$versions.anko", 
compile "org.jetbrains.anko:anko-appcompat-v7:$versions.anko", 
compile "org.jetbrains.anko:anko-cardview-v7:$versions.anko", 
compile "org.jetbrains.anko:anko-recyclerview-v7:$versions.anko", 
compile "org.jetbrains.anko:anko-gridlayout-v7:$versions.anko", 

作爲後續問題:如果lparams是確實沒有了,那麼是否有比我已經做的更優雅的替代品?

回答

5

顯然lparams仍然存在,但不能被用作最外層佈局的擴展功能:

所以下面的代碼失敗:

override fun createView(ui: AnkoContext<ReviewsFragment>) = ui.apply { 
    verticalLayout { 
     // Layout elements here 
    }.lparams { 
     // Layout params here 
    } 
}.view 

但這編譯罰款:

override fun createView(ui: AnkoContext<ReviewsFragment>) = ui.apply { 
    verticalLayout { 
     lparams { 
      // Layout params here 
     } 

     // Layout elements here 
     verticalLayout { }.lparams { 
      // lparams works fine if there is a parent layout 
     } 
    } 
}.view 

值得注意的是,使用lparams的非拖尾版本不鼓勵內部佈局:它會創建錯誤的subl當嵌套的佈局是不同的類型時,屁股的LayoutParams。有關完整的討論,請參閱此GitHub Issue

1

爲什麼不使用最新的方法來編寫createView()方法? 我認爲以下解決您的問題:

override fun createView(ui: AnkoContext<ReviewsFragment>) : View = with(ui) { 
    return verticalLayout { 
    // Layout elements here 
    }.lparams { 
    // Layout params here 
    } 
}