Android ConstraintLayout - как программно установить поля для элементов chain_packed

Это мой код:

ConstraintLayout.LayoutParams buttonParams = new ConstraintLayout.LayoutParams(40,105);
buttonParams.setMargins(8,16,24,32);
secretCodeFields = findViewById(R.id.secretCodeFields);
for (int i = 0; i < 4; i++) {
    Button b = new Button(this);
    vID[i]=View.generateViewId();
    b.setId(vID[i]);
    b.setLayoutParams(buttonParams);

    secretCodeFields.addView(b);
}
set.clone(secretCodeFields);
set.createHorizontalChain(
    secretCodeFields.getId(),ConstraintSet.LEFT,
    secretCodeFields.getId(),ConstraintSet.RIGHT,
    vID,null,ConstraintSet.CHAIN_PACKED
    );
set.applyTo(secretCodeFields);

Кнопки добавляются в одно и то же место (поэтому видна только последняя). Тот же результат, если я удаляю "b.setLayoutParams(buttonParams);" линия и использование

secretCodeFields.addView(b,buttonParams);

Но если я добавлю кнопку с параметрами ширины и высоты, это сработает, но полей больше нет:

secretCodeFields.addView(b,90,90);

Что я делаю не так?

РЕДАКТИРОВАТЬ: secretCodeFields является ConstraintLayout

Я нашел решение. Я добавил поля ПОСЛЕ set.applyTo...:

for (int i = 0; i < codeLenght; i++) {
        Button b = (Button)findViewById(vID[i]);
        ConstraintLayout.LayoutParams p = (ConstraintLayout.LayoutParams) b.getLayoutParams();
        p.setMargins(6,0,6,0);
        b.setLayoutParams(p);
    }

Это работает, но я не знаю, является ли это лучшим решением.

1 ответ

Я знаю, что это поздний ответ, но вот он

вConstraintSet.CHAIN_PACKEDудалит все применяемые поля для ваших представлений, вы должны сначала создать цепочку в ConstraintSet, а затем применить поля с помощью ConstrainSetconnect(int startID, int startSide, int endID, int endSide, int margin)метод указания полей.

Другие вопросы по тегам