【问题标题】:Anko 0.8 - unresolved lparams referenceAnko 0.8 - 未解决的 lparams 参考
【发布时间】:2015-12-18 08:43:54
【问题描述】:

主要问题是:lparams 只是从 Anko 中消失了,还是我做错了什么?以下sn-p编译失败:

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 确实消失了,那么还有比我已经在做的更优雅的替代品吗?

【问题讨论】:

    标签: kotlin anko


    【解决方案1】:

    显然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 Issue

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        • 2021-08-17
        • 2016-12-14
        • 2020-05-27
        • 2019-11-16
        相关资源
        最近更新 更多