Добавление представления с весом программно в LinearLayout в Kotlin

#android #kotlin

Вопрос:

РЕДАКТИРОВАТЬ — Добавление полного кода

 <androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.camera.view.PreviewView
        android:id="@ id/viewFinder"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <androidx.appcompat.widget.LinearLayoutCompat
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@ id/barsContainer"
        android:layoutDirection="rtl"
        app:layout_constraintBottom_toBottomOf="parent">

    </androidx.appcompat.widget.LinearLayoutCompat>

</androidx.constraintlayout.widget.ConstraintLayout>
 
 class MainActivity : AppCompatActivity() {
    private var barsIndex = BooleanArray(30) { false }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val viewBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)

        val layoutParams =
            LinearLayout.LayoutParams(0, 80, 1f)
        viewBinding.barsContainer.weightSum = (barsIndex.size).toFloat()
        for (index in barsIndex.indices) {
            val barView = View(this)
//            layoutParams.setMargins(60, 60, 60, 60)
            barView.setBackgroundColor(Color.parseColor("#FFFFFF"))
            barView.layoutParams = layoutParams
            viewBinding.barsContainer.addView(barView)
        }
    }
}
 

Ну, я много искал и нашел много ответов на этот вопрос, но до сих пор он у меня не работал.

Я хочу добавить несколько полос одинаковой ширины в линейный вывод. это то, что я получил до сих пор:

 <androidx.appcompat.widget.LinearLayoutCompat
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@ id/barsContainer"
        android:layoutDirection="rtl"
        app:layout_constraintBottom_toBottomOf="parent">

</androidx.appcompat.widget.LinearLayoutCompat>
 

и В моей Деятельности.кт:

 viewBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(viewBinding.root)

val layoutParams = LinearLayout.LayoutParams(0, 80, 1f)
for (index in barsIndex.indices) {
     val barView = View(this)
     barView.setBackgroundColor(Color.parseColor("#FFFFFF"))
     barView.layoutParams = layoutParams
     viewBinding.barsContainer.addView(barView, index)
     }

viewBinding.barsContainer.requestLayout()
 

тем не менее, он не учитывает вес (третий параметр), и если я добавлю немного ширины, это сработает, но это не то, что я хочу.

Я пробовал и 0, и LinearLayout.LayoutParams.WRAP_CONTENT для ширины это все равно не работает.

добавление поля для детей тоже не работает!

Любая помощь будет признательна

Ответ №1:

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

         barsContainer.weightSum = (barsIndex.size).toFloat()
 

Чтобы убедиться, что он берет правильные веса, чтобы он также правильно разделил макет

   val barsContainer = findViewById<LinearLayoutCompat>(R.id.barsContainer)
    val barsIndex = arrayListOf<Int>(1, 2, 3, 4)
    barsContainer.weightSum = (barsIndex.size).toFloat()
    val layoutParams = LinearLayoutCompat.LayoutParams(0, 150, 1f)
    for (index in barsIndex.indices) {
        val barView = View(this)
        barView.setBackgroundColor(Color.parseColor("#ff${(index 1)*22}00"))
        barView.layoutParams = layoutParams
        barsContainer.addView(barView,index)
    }
 

введите описание изображения здесь

   val barsIndex = arrayListOf<Int>(1, 2, 3, 4)
    barsContainer.weightSum = (barsIndex.size).toFloat()
    val layoutParams = LinearLayoutCompat.LayoutParams(0, 150, 1f)
    layoutParams.marginEnd=1
    layoutParams.marginStart=1
    for (index in barsIndex.indices) {
        val barView = View(this)
        barView.setBackgroundColor(Color.parseColor("#ff${(index 1)*22}00"))
        barView.layoutParams = layoutParams
        barsContainer.addView(barView,index)
    }
 

введите описание изображения здесь

Комментарии:

1. Результат в значительной степени соответствует тому, что я хочу, но я использовал ваш код, даже изменил привязку к классическим представлениям поиска, все равно он не отображается! может быть, я делаю что-то не так!? пока вы этим занимаетесь, можете ли вы добавить как 1dp-поле между представлениями?

2. я просто редактирую его @ArmanMomeni

3. Спасибо, чувак, я все еще не могу понять, почему это не работает на моей стороне

4. опубликуйте полный код и полный xml-код plase

5. Добавлен полный код.