2015-12-18 60 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 
    } 
}