Kotlin: Как получить доступ к Attrs для CustomView

Я создаю пользовательский вид в Kotlin и хочу получить доступ к его ресурсу атрибутов.

Ниже мой код

class CustomCardView : FrameLayout { constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet) : super(context, attrs) constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) init { LayoutInflater.from(context).inflate(R.layout.view_custom_card, this, true) if (attrs != null) { val a = context.obtainStyledAttributes(attrs, R.styleable.custom_card_view) if (a.hasValue(R.styleable.custom_card_view_command)) { var myString = a.getString(R.styleable.custom_card_view_command) } } } } 

Обратите внимание, что это приведет к ошибке в attrs в функции init. Мне интересно, как получить доступ к attrs ?

Вы не можете получить доступ к второму конструкторному параметру из блока init . Но есть как минимум два способа реализовать аналогичную функциональность.

Первый подход заключается в использовании одного первичного конструктора с параметрами по умолчанию вместо нескольких вторичных конструкторов. В этом случае вам нужно применить аннотацию @JvmOverloads к конструктору, чтобы заставить Kotlin генерировать три разных конструктора.

 class CustomCardView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : FrameLayout { init { LayoutInflater.from(context).inflate(R.layout.view_custom_card, this, true) if (attrs != null) { val a = context.obtainStyledAttributes(attrs, R.styleable.custom_card_view) if (a.hasValue(R.styleable.custom_card_view_command)) { var myString = a.getString(R.styleable.custom_card_view_command) } } } } 

Подход секунд – два конструктора цепей и перемещение содержимого блока init в конструктор с тремя аргументами.

 class CustomCardView : FrameLayout { constructor(context: Context) : this(context, null) constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0) constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { LayoutInflater.from(context).inflate(R.layout.view_custom_card, this, true) if (attrs != null) { val a = context.obtainStyledAttributes(attrs, R.styleable.custom_card_view) if (a.hasValue(R.styleable.custom_card_view_command)) { var myString = a.getString(R.styleable.custom_card_view_command) } } } } 

Адаптируя ваш код, я думаю, вы также можете сделать что-то вроде этого:

 class CustomCardView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : FrameLayout(context, attrs, defStyleAttr) { constructor(context: Context) : this(context, null) constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) init { LayoutInflater.from(context).inflate(R.layout.view_custom_card, this, true) if (attrs != null) { val a = context.obtainStyledAttributes(attrs, R.styleable.custom_card_view) if (a.hasValue(R.styleable.custom_card_view_command)) { var myString = a.getString(R.styleable.custom_card_view_command) } a.recycle() } } } 
  • соединение между сеткой и списком.
  • Выровненный метод, не возвращающий значение из тестовой локальной переменной
  • Постоянная поддержка на android oreo
  • Почему я не могу установить слушателя в Котлине?
  • RxJava как создать наблюдаемый из подписки
  • Android RxJava onNext вызывается, даже если наблюдатель не подписан
  • Несоответствие типов. Обязательная карта <String, Any> Найдено карта <String, Any?>
  • Android Studio (Kotlin) GsonBuilder.registerTypeAdapter () дает 2 ошибки
  • Единичное тестирование Rxjava наблюдаемых, которые имеют задержку
  • Android kotlin onTouchListener хочет, чтобы я переопределял функцию performClick ()
  • OnComplete никогда не вызывал с toSortedList () и groupBy ()
  • Давайте будем гением компьютера.