Анко вид из класса

Я реализовал класс, который выполняет различные API-запросы, моя идея заключалась в том, что каждый экземпляр класса имеет метод для создания представления, чтобы иметь интерфейс, похожий на плитку.

Моя проблема в том, что я не знаю, как это должно быть реализовано в хорошем смысле.

Каков предпочтительный способ сделать это с помощью Anko и Kotlin?


person aul12    schedule 24.02.2017    source источник


Ответы (1)


У Anko есть отличная документация по этому делу (но кто читай документы, да?)

Скажем, CustomView — это ваше пользовательское имя класса View, а customView — это то, что вы хотите написать в DSL.

Если вы планируете использовать только свой собственный View в DSL в окружении других View:

inline fun ViewManager.customView(theme: Int = 0) = customView(theme) {}
inline fun ViewManager.customView(theme: Int = 0, init: CustomView.() -> Unit) = ankoView({ CustomView(it) }, theme, init)

Итак, теперь вы можете написать это:

frameLayout {
    customView()
}

… или это (см. главу об оболочке пользовательского интерфейса):

UI {
    customView()
}

Но если вы хотите использовать свое представление в качестве виджета верхнего уровня без оболочки пользовательского интерфейса внутри Activity, добавьте и это:

inline fun Activity.customView(theme: Int = 0) = customView(theme) {}
inline fun Activity.customView(theme: Int = 0, init: CustomView.() -> Unit) = ankoView({ CustomView(it) }, theme, init)

Пример (именно так я бы его использовал, вы можете выбрать другой подход):

class YourAwesomeButton: Button() {
    /* ... */ 
    fun makeThisButtonAwesome() {/* ... */}
}

/** This lines may be in any file of the project, but better to put them right under the button class */
inline fun ViewManager.yourAwesomeButton(theme: Int = 0) = yourAwesomeButton(theme) {}
inline fun ViewManager.yourAwesomeButton(theme: Int = 0, init: CustomView.() -> Unit) = 
    ankoView({ YourAwesomeButton(it) }, theme, init)

В другом файле:

class YourAwesomeActivity: Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(saveInstanceState)
        relativeLayout(R.style.YourAwesomeAppTheme) {
            yourAwesomeButton(R.style.YourAwesomeAppTheme) {
                makeThisButtonAwesome()
            }.lparams {
                centerInParent()
            }
        }
    }
}
person Dima Rostopira    schedule 25.02.2017
comment
Я прочитал эту часть документации, но мне все еще неясно, как использовать эти фрагменты кода. У вас есть пример? - person aul12; 25.02.2017
comment
@aul12 добавил пример - person Dima Rostopira; 26.02.2017
comment
Хм, эта ссылка на документацию мертва. Похоже, документы в репозитории Anko были заменены тремя изображениями png, которые особо не пригодятся... - person Abby; 19.07.2018