安科0.8 – 未解决的lparams参考

主要的问题是: lparams 以下片段无法编译:

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

虽然这工作没有任何问题:

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

我不介意太多的第二个选项,但是你必须在生成参数的时候指定布局类型,这样会比较麻烦(也比原来的解决方案更脆弱)。

我还没有在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 } 

相关的Gradle条目(我正在使用Kotlin 1.0.0-beta-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确实消失了,那么是否有比我已经做的更优雅的替换?

显然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的非拖尾版本:当嵌套的布局是不同的类型时,它会创建错误的LayoutParams类。 有关完整的讨论,请参阅此GitHub问题 。

为什么不使用最新的方法来编写createView()方法? 我认为以下解决您的问题:

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