Anko 0.8 - ссылка на неразрешенные lparams

Главный вопрос: lparams просто ушел из Anko, или я что-то ужасно не так делаю? Следующий фрагмент кода не компилируется:

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

Пока это работает без проблем:

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

Я бы не стал возражать против второго варианта, но вы должны указать тип макета при генерации параметров, что может быть немного утомительным (а также более хрупким, чем исходное решение).

Я ничего не нашел на Anko странице GitHub, в журнале изменений или просмотром последних коммитов. Вот полный класс пользовательского интерфейса для справки:

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 действительно исчез, то есть ли более элегантная замена, чем то, что я уже делаю?


person Gustorn    schedule 18.12.2015    source источник


Ответы (2)


Очевидно, 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.

person Gustorn    schedule 19.12.2015

Почему бы вам не использовать самый последний способ написания createView() метода? Думаю, вашу проблему решит следующее:

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