Я пытаюсь создать подкласс ConstraintLayout для создания динамического меню, которое я могу передать элементам, и оно будет создавать представление с настроенными под-представлениями. Кажется, я борюсь с тем, чтобы в Котлине выкладывать вещи горизонтально
Я пробовал несколько вещей, я пытался разложить элементы и привязать их друг к другу, при этом первый и последний элементы привязаны к родителю. и я попытался использовать ConstraintSet для нескольких цепочек
Вот как я его инициализирую.
val menuLayout = ManageableMenu(tc,listOf(
ManageableMenu.ManageableMenuItem("Item 1"),
ManageableMenu.ManageableMenuItem("Item 2"),
ManageableMenu.ManageableMenuItem("Item 3"),
ManageableMenu.ManageableMenuItem("Item 4")
))
menuLayout.listener = this
val menuLayoutConstraint =menuLayout .layoutParams as ConstraintLayout.LayoutParams
menuLayoutConstraint.topToBottom = actorName.id
menuLayoutConstraint.startToStart = thisLayout.id
menuLayoutConstraint.endToEnd = thisLayout.id
thisLayout.addView(menuLayout)
Я пытался ...
class ManageableMenu(context: Context, val items: List<ManageableMenuItem>): ConstraintLayout(context) {
var textSize: Int = 17
var textColor: Int = Color.WHITE
var activeFragmentTitle: String = items[0].title
var listener: ManageableMenuChangeListener? = null
init {
this.id = View.generateViewId()
this.layoutParams =
ConstraintLayout.LayoutParams(convertToDP(100, this.context), ConstraintLayout.LayoutParams.WRAP_CONTENT)
val baseConstraint = ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.WRAP_CONTENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT
)
this.setBackgroundColor(Color.BLACK)
//Build Dividers
val dividers: MutableList<TextView> = mutableListOf()
if (items.size > 1) {
repeat(items.size - 1) {
val newView = TextView(this.context)
newView.id = View.generateViewId()
newView.text = "|"
newView.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize + 8.toFloat())
newView.setTextColor(textColor)
dividers.add(newView)
}
}
val constraintSet = ConstraintSet()
constraintSet.clone(this)
val dividerIds: IntArray = IntArray(dividers.size)
for ((index, divider) in dividers.withIndex()) {
dividerIds.set(index, divider.id)
}
constraintSet.createHorizontalChainRtl(
dividerIds[0],
ConstraintSet.START,
this.id,
ConstraintSet.END,
dividerIds,
null,
ConstraintSet.CHAIN_SPREAD
)
constraintSet.applyTo(this)
for (divider in dividers) {
this.addView(divider)
}
}
data class ManageableMenuItem(val title: String) {
var id: Int? = null
}
interface ManageableMenuChangeListener {
fun onMenuItemChanged(var1: String)
}
}
Это помещает стек всех "|" созданные друг над другом, полностью слева от вида. (Если я могу прикрепить фотографии, я буду)
Я тоже пытался ...
class ManageableMenu(context: Context, val items: List<ManageableMenuItem>): ConstraintLayout(context) {
var textSize: Int = 17
var textColor: Int = Color.WHITE
var activeFragmentTitle: String = items[0].title
var listener: ManageableMenuChangeListener? = null
init {
this.id = View.generateViewId()
this.layoutParams =
ConstraintLayout.LayoutParams(convertToDP(100, this.context), ConstraintLayout.LayoutParams.WRAP_CONTENT)
val baseConstraint = ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.WRAP_CONTENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT
)
this.setBackgroundColor(Color.BLACK)
//Build Dividers
val dividers: MutableList<TextView> = mutableListOf()
if (items.size > 1) {
repeat(items.size - 1) {
val newView = TextView(this.context)
newView.id = View.generateViewId()
newView.text = "|"
newView.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize + 8.toFloat())
newView.setTextColor(textColor)
dividers.add(newView)
}
}
for ((index, divider )in dividers.withIndex()) {
val constraint = ConstraintLayout.LayoutParams(baseConstraint)
constraint.topToTop = this.id
constraint.bottomToBottom = this.id
if (index == 0){
constraint.leftToLeft = this.id
constraint.rightToLeft = dividers[index+1].id
} else if (index == dividers.lastIndex) {
constraint.rightToRight = this.id
constraint.leftToRight = dividers[index-1].id
} else {
constraint.rightToLeft = dividers[index+1].id
constraint.leftToRight = dividers[index-1].id
}
divider.layoutParams = constraint
this.addView(divider)
}
}
data class ManageableMenuItem(val title: String) {
var id: Int? = null
}
interface ManageableMenuChangeListener {
fun onMenuItemChanged(var1: String)
}
}
Это выравнивает стек "|" в центре зрения. Что я делаю неправильно?! Любая помощь приветствуется! Спасибо.