6

主要问题是:是lparams从 Anko 中消失了,还是我做错了什么?以下代码段无法编译:

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

虽然这没有任何问题:

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

我不会太介意第二个选项,但是您必须在生成参数时指定布局类型,这可能会有点烦人(并且也比原始解决方案更脆弱)。

我没有在AnkoGitHub 页面、更改日志或浏览最近的提交中找到任何内容。这是完整的 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确实消失了,那么是否有比我已经在做的更优雅的替代品?

4

2 回答 2

8

显然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 问题

于 2015-12-19T06:49:10.363 回答
1

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

override fun createView(ui: AnkoContext<ReviewsFragment>) : View = with(ui) { 
    return verticalLayout { 
    // Layout elements here 
    }.lparams { 
    // Layout params here 
    } 
}
于 2016-06-09T03:05:46.703 回答