Создание набора ограничений из макета с помощью слияния - PullRequest
0 голосов
/ 14 апреля 2019

Я хочу сделать Changebounds() анимацию из одного набора ограничений в другой.

Обычно я делаю это, создавая два набора ограничений:

private val originalState = ConstraintSet().apply {
    clone(context, R.layout.layout_meta_syntactic)
}

private val expandedState = ConstraintSet().apply {
    clone(context, R.layout.layout_meta_syntactic)
    // Change some constraints
    connect(
        R.id.button, ConstraintSet.END,
        R.id.foo_text, ConstraintSet.START
    )
}

И анимируя взад и вперед с помощью:

TransitionManager.beginDelayedTransition(id_of_my_component_in_fragment, transition)
originalState.applyTo(id_of_my_component_in_fragment)

Но теперь я застрял с тегом <merge> в макете, из которого я хочу клонировать.Макет слияния является базой для составного компонента, который расширяет ConstraintLayout.

Составной компонент:

class MyCompoundView : ConstraintLayout {

// Omissions
inflate(context, R.layout.layout_meta_syntactic, this)

накачивание:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/some_id"
    tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">

    // Views 

При попытке клонировать макет внабор ограничений программно получаю:

 Caused by: android.view.InflateException: Binary XML file line #2: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true
 Caused by: android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true

Как мне создать наборы ограничений из такого макета?

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

У вас есть два варианта:

  1. Создайте еще один (фиктивный) файл макета с корнем ConstraintLayout, который содержит ссылку на макет с тегом include.
  2. Клонировать параметры макета из нового экземпляра пользовательского представления: ConstraintSet.clone(context, MyCompoundView(context)).

ConstraintSet.clone(context, layoutRes) на самом деле довольно грубый ( source ), он по существу раздувает новый ConstraintLayout из предоставленного файла макета, включая все дочерние представления, перед разрешением их параметров макета для сборки ConstraintSet.

0 голосов
/ 14 апреля 2019

Решение состоит в клонировании составного компонента, который является ConstraintLayout

class MyCompoundView : ConstraintLayout {

    // make sure to clone after inflating the layout to the component

    originalState = ConstraintSet().apply {
        clone(this@MyCompoundView)
    }

    expandedState = ConstraintSet().apply {
        clone(this@MyCompoundView)
        // Change some constraints
         connect(
             R.id.button, ConstraintSet.END,
             R.id.foo_text, ConstraintSet.START
        )
    }
}
...