Intereting Posts

Как использовать 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 , но все равно не повезло.

С 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)) 

После выкапывания исходного кода 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(...)

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

 override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { return UI { verticalLayout { linearLayout { // ... } linearLayout { // ... } } }.view }