2016-09-02 2 views
18

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

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 - это шаг в правильном направлении, но я хотел бы сделать это программно.

+0

Почему бы не сделать это используя XML? – Zoe

+4

существует так много причин, по которым люди хотят делать это программно, например, люди разрабатывают библиотеки, отличные от приложений, у которых есть предопределенный ui, или люди нуждаются в изменении спецификаций макета, влияющих на взаимодействие пользователей во время выполнения и даже по другим причинам. .. Google действительно не хватает документов по этой новой функции. – yongsunCN

+2

Другая (простая) причина: @ Polarbear0106 - это то, что если вам нужно использовать TransitionManager и, в частности, TransitionManager.beginDelayedTransition (root); 'then you _need_, чтобы вручную указать изменения макета они оказываются в следующем проходе. Итак, да, есть моменты, когда вам нужно программно модифицировать материал. –

ответ

34

Немного поздно в игре, но вам нужно в основном рассматривать ваши взгляды в макете ограничений, как обычные представления, которые просто имеют свои собственные 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); 
+5

В моем случае это было необходимо, чтобы добавить set.clone (mConstraintLayout) скопировать текущие ограничения перед добавлением –

+0

вы носите швабры @Martin Marconcini? –

+1

@TomHoward Я бы не посмел! ;) (если вам интересно, http://www.thinkgeek.com/product/f0d0/) В случае, если ссылка не удалась в будущем, google «Dwarven Beard Hat» (я принес ее @ think geek), как 5 лет тому назад. –

Смежные вопросы