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


12


источник


Ответы:


С помощью 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))

16



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


10



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

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

3