Расширил
FrameLayout . Связал с этим кастомным View некоторый layout. Хочу использовать его для отображения данных через кастомное свойство (для этого используется BindingAdapter, т.к. в будущем туда будет прокидываться один из классов реализующий некоторый интерфейс, поэтому
attr.xml Не подходит). Использование этого кастомного View планируется через xml, поэтому управление им из кода не есть гуд. В идеале, срабатывает биндинг адаптер и выполняется кастомная логика над данными в нем и внутри меняются состояния компонентов на layout, который связан с этим кастомным View в конструкторе. Использование этого кастомного View планируется также и в
Recycler, прошу учесть этот момент. Для простоты примера, я вытащил из Recycler-а кастомный View и кинул его просто н фрагмент. Он также не работает. Если добавить статический текст (то отображение его есть), то есть отсутствуют на ui изменения, которые должны произойти при срабатывании биндинга, но через дебаг режим биндинг срабатывает.
Код кастомного View :
class RecalculateView : FrameLayout {
lateinit var binding: ViewRecalculateLayoutBinding
lateinit var name: String
constructor(context: Context) : super(context){
initView(context)
}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs){
initView(context)
}
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr){
initView(context)
}
private fun initView(context: Context){// Связать файл разметки с текущим View
inflate(context, R.layout.view_recalculate_layout, this) // связать xml и view
binding = ViewRecalculateLayoutBinding.inflate(
LayoutInflater.from(context)
)
}
}
@BindingAdapter(value = ["setName"], requireAll = true)
fun <ITEM: String> RecalculateView.name(item: ITEM?){
item?.let{
binding.tex.text = it
}
}
код связанного с ним слоя
view_recalculate_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/tex"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textColor="@color/black"/>
</layout>
код разметки фрагмента, на котором отображение должно происходить:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ru.startex.app.basic_recalculate.RecalculateView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:setName="@{`it is hell`}"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>