Подтвердить что ты не робот

Формат Android Constraint Programmatically?

В iOS я большой поклонник удаления раскадровки и использования картографической структуры, чтобы выложить все из кода. Это украдено из картографии github:

constrain(view1, view2) { view1, view2 in
    view1.width   == (view1.superview!.width - 50) * 0.5
    view2.width   == view1.width - 50
    view1.height  == 40
    view2.height  == view1.height
    view1.centerX == view1.superview!.centerX
    view2.centerX == view1.centerX

    view1.top >= view1.superview!.top + 20
    view2.top == view1.bottom + 20
}

Есть ли какой-либо эквивалент для Android? Кажется, что новый макет Constraint Layout является шагом в правильном направлении, но я хотел бы сделать это программно.

4b9b3361

Ответ 1

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

В случае с ConstraintLayout документация находится здесь: https://developer.android.com/reference/android/support/constraint/ConstraintLayout.LayoutParams.html

Этот класс содержит различные атрибуты, определяющие, как представление должно быть выложено внутри ConstraintLayout. Для создания ограничений во время выполнения рекомендуется использовать ConstraintSet.

Итак, рекомендуемый метод - использовать ConstraintSet.

Там хороший образец кода, но основная идея - создать новый набор (путем копирования/клонирования/нового и т.д.), установить его свойства и затем применить его к вашему макету.

Например: предположим, что ваш макет содержит ConstraintLayout (здесь называется mConstraintLayout), и внутри него есть представление (R.id.go_button в образце), вы можете сделать:

    ConstraintSet set = new ConstraintSet();

    // You may want (optional) to start with the existing constraint,
    // so uncomment this.
    // set.clone(mConstraintLayout); 

    // Resize to 100dp
    set.constrainHeight(R.id.go_button, (int)(100 * density));
    set.constrainWidth(R.id.go_button, (int)(100 * density));

    // center horizontally in the container
    set.centerHorizontally(R.id.go_button, R.id.rootLayout);

    // pin to the bottom of the container
    set.connect(R.id.go_button, BOTTOM, R.id.rootLayout, BOTTOM, 8);

    // Apply the changes
    set.applyTo(mConstraintLayout); 
    // this is my… (ConstraintLayout) findViewById(R.id.rootLayout);

Ответ 2

Я столкнулся с той же самой дилеммой, исходящей из iOS, где я чувствую, что создание представлений программно - более распространенная практика.

Я на самом деле портирую библиотеку Stevia на android с Kotlin здесь, так как новый ConstraintLayout очень похож на наш любимый Autolayout.

Вот как вы определяете простой вид

class MyView(context: Context): ConstraintLayout(context) {

  val label = TextView(context)

  init {

      // View Hierarchy
      subviews(
          label
      )

      // Layout
      label.centerInParent()

      // Style
      label.style {
          textSize = 12F
      }
  }}

Имейте в виду, что это чистый родной шаблон Constraint под капотом, как объяснил ответ Мартина.

Это только начало, но оказалось, что до сих пор это был восхитительный способ писать представления для Android в Kotlin, так что я решил поделиться. Надеюсь это поможет :)