Как использовать Anko DSL внутри фрагмента?

На вики-странице Github показан этот пример для использования в экземпляре Activity:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    verticalLayout {
        padding = dip(30)
        editText {
            hint = "Name"
            textSize = 24f
        }
        editText {
            hint = "Password"
            textSize = 24f
        }
        button("Login") {
            textSize = 26f
        }
    }
}

Как сделать то же самое внутри Fragment?

Я попытался поместить этот блок verticalLayout в onCreateView, но этот метод не может быть разрешен. Я добавил зависимость anko-support-v4, но все равно не повезло.


person akhy    schedule 16.11.2015    source источник
comment
попробуйте перейти к методу verticalLayout. Я предполагаю, что он определен на Activity, поэтому он работает внутри него, но не снаружи.   -  person voddan    schedule 16.11.2015
comment
Если то, что я сказал, верно, то решением будет попытаться назначить макет соответствующему свойству. В вашем примере это как бы висит в воздухе   -  person voddan    schedule 16.11.2015
comment
@voddan да, это доступно только в Activity. Наконец, я нашел обходной путь, скоро опубликую ответ   -  person akhy    schedule 17.11.2015


Ответы (3)


С Anko 0.8 вы также можете использовать AnkoComponent, если хотите сохранить свой пользовательский интерфейс в отдельном классе, чтобы вы могли повторно использовать его в другом месте.

class FragmentUi<T>: AnkoComponent<T> {
    override fun createView(ui: AnkoContext<T>) = with(ui) {
        verticalLayout {
            // ...
        }
    }
}

Вы можете назвать это в своем фрагменте onCreateView() по

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle?): View
        = FragmentUi<Fragment>().createView(AnkoContext.create(ctx, this))
person RussHWolf    schedule 27.12.2015
comment
AnkoContext.create(ctx, this) устарел. вместо ctx нужно использовать requireContext() - person LeoColman; 05.01.2019

После раскопок anko-support-v4 исходного кода, а также нескольких проб и ошибок, я нашел обходной путь, хотя я не уверен, что это правильный/рекомендуемый способ. Кажется, это немного недокументировано.

Пример из моего кода Fragment:

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    return UI {
        verticalLayout {
            linearLayout {
                avatar = imageView().lparams(width = dip(48), height = dip (48))
                name = textView().lparams(width = 0, weight = 1f)
            }

            linearLayout {
                // ...
            }
        }
    }.toView()
} 

Я возвращаю макет DSL, завернутый в UI { ... }.toView() в Fragment.onCreateView(...)

person akhy    schedule 17.11.2015

Начиная с anko 0.8.1 правильный код будет таким:

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return UI {
        verticalLayout {
            linearLayout {
                // ...
            }
            linearLayout {
                // ...
            }
        }
    }.view
} 
person Eefret    schedule 21.03.2016
comment
он говорит, что хочет, когда? в LayoutInflater удален - person Qube; 29.10.2018