Как динамически установить вес в макете ограничения - PullRequest
3 голосов
/ 25 июня 2019

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

XML-эквивалент того, что я хочу кодировать динамически:

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <no.beiningbogen.snute.common.view.TouchAwareSeekBar
        android:id="@+id/touchAwareSeekBar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:dsb_indicatorColor="@color/discrete_seek_bar"
        app:dsb_progressColor="@color/discrete_seek_bar"
        app:dsb_scrubberHeight="5dp"
        app:dsb_thumbSize="20dp"
        app:dsb_trackColor="@color/colorMaterialGray300"
        app:dsb_trackHeight="5dp"
        app:layout_constraintEnd_toStartOf="@+id/device_switch"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.appcompat.widget.SwitchCompat
        android:id="@+id/device_switch"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:background="@null"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/touchAwareSeekBar"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Это код, который я реализовал:

val layout = ConstraintLayout(context).apply {
        id = View.generateViewId()
        layoutParams = ConstraintLayout.LayoutParams(
            ConstraintLayout.LayoutParams.MATCH_PARENT,
            ConstraintLayout.LayoutParams.WRAP_CONTENT
        )
    }

val dimLevelView = map[DeviceAttributeType.dimLevel]
val onView = map[DeviceAttributeType.on]

layout.addView(dimLevelView)
layout.addView(onOffView)

val set = ConstraintSet()
set.clone(layout)

set.connect(dimLevelView.id, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START)
set.connect(dimLevelView.id, ConstraintSet.END, onView.id, ConstraintSet.START)
set.connect(dimLevelView.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP)
set.centerVertically(dimLevelView.id, ConstraintSet.PARENT_ID)
set.setHorizontalWeight(dimLevelView.id, 1.toFloat())

set.connect(onView.id, ConstraintSet.START, dimLevelView.id, ConstraintSet.END)
set.connect(onView.id, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END)
set.connect(onView.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP)
set.centerVertically(onView.id, ConstraintSet.PARENT_ID)

set.applyTo(layout)

Я получаю dim и onOff views из xml:

<!-- one file to define this -->
<no.beiningbogen.snute.common.view.TouchAwareSeekBar
    android:id="@+id/touchAwareSeekBar"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:dsb_indicatorColor="@color/discrete_seek_bar"
    app:dsb_progressColor="@color/discrete_seek_bar"
    app:dsb_scrubberHeight="5dp"
    app:dsb_thumbSize="20dp"
    app:dsb_trackColor="@color/colorMaterialGray300"
    app:dsb_trackHeight="5dp" />

<!-- in another file -->
<androidx.appcompat.widget.SwitchCompat
    android:id="@+id/device_switch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@null" />

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

1 Ответ

0 голосов
/ 27 июня 2019

Код почти правильный. Вы не указываете начальное ограничение для SeekBar , поэтому оно исчезает вместе со всем остальным. Попробуйте следующее:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(createLayout())
        supportActionBar?.setTitle("")

    }

    fun createLayout(): ConstraintLayout {

        val layout = ConstraintLayout(this).apply {
            id = View.generateViewId()
            layoutParams = ConstraintLayout.LayoutParams(
                ConstraintLayout.LayoutParams.MATCH_PARENT,
                ConstraintLayout.LayoutParams.WRAP_CONTENT
            )
        }

        val dimLevelView = LayoutInflater.from(this).inflate(R.layout.seekbar_widget, layout, false)
        val onView = LayoutInflater.from(this).inflate(R.layout.switch_widget, layout, false)

        layout.addView(dimLevelView)
        layout.addView(onView)

        val set = ConstraintSet()
        set.clone(layout)

        set.connect(
            dimLevelView.id,
            ConstraintSet.START,
            ConstraintSet.PARENT_ID,
            ConstraintSet.START
        )

        set.connect(
            dimLevelView.id,
            ConstraintSet.START,
            ConstraintSet.PARENT_ID,
            ConstraintSet.START
        )
        set.connect(dimLevelView.id, ConstraintSet.END, onView.id, ConstraintSet.START)
        set.connect(dimLevelView.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP)
        set.centerVertically(dimLevelView.id, ConstraintSet.PARENT_ID)
        set.setHorizontalWeight(dimLevelView.id, 1.toFloat())

        set.connect(onView.id, ConstraintSet.START, dimLevelView.id, ConstraintSet.END)
        set.connect(onView.id, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END)
        set.connect(onView.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP)
        set.centerVertically(onView.id, ConstraintSet.PARENT_ID)

        set.applyTo(layout)
        return layout
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...