2017-01-15 7 views
4

Я хочу добавить 2 кнопки в ConstraintLayout. Мой текущий код выглядит следующим образом:ConstraintLayout: Как добавить несколько видов программно?

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.activity_main); 
    ConstraintSet set = new ConstraintSet(); 
    set.clone(layout); 

    //Button 1: 
    Button button = new Button(this); 
    button.setText("Hello"); 
    layout.addView(button); 

    set.connect(button.getId(), ConstraintSet.LEFT, layout.getId(), ConstraintSet.LEFT, 0); 
    set.connect(button.getId(), ConstraintSet.RIGHT, layout.getId(), ConstraintSet.RIGHT, 0); 
    set.connect(button.getId(), ConstraintSet.BOTTOM, layout.getId(), ConstraintSet.BOTTOM, 0); 
    set.constrainWidth(button.getId(), ConstraintSet.MATCH_CONSTRAINT); 
    set.constrainHeight(button.getId(), 200); 
    set.applyTo(layout); 


    //Button 2:  
    Button newButton = new Button(this); 
    newButton.setText("Yeeey"); 
    layout.addView(newButton); 

    set.connect(newButton.getId(), ConstraintSet.BOTTOM, button.getId(), ConstraintSet.TOP, 0); 
    set.connect(newButton.getId(), ConstraintSet.LEFT, button.getId(), ConstraintSet.LEFT, 0); 
    set.connect(newButton.getId(), ConstraintSet.RIGHT, button.getId(), ConstraintSet.RIGHT, 0); 
    set.constrainHeight(newButton.getId(), 200); 
    set.applyTo(layout); 

} 

Но я получаю только 1 видимую кнопку (другой, вероятно, скрывается за этого), и он находится в верхнем левом углу экрана. Предполагается, что в нижней части экрана есть две кнопки, связанные друг с другом.

Что я здесь делаю неправильно?

enter image description here

Желаемый результат:

enter image description here

ответ

7

Вот рабочий код, что вы хотите достичь

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.activity_main); 
     ConstraintSet set = new ConstraintSet(); 
     set.clone(layout); 

     //Button 1: 
     Button button = new Button(this); 
     button.setText("Hello"); 
     button.setId(100);   // <-- Important 
     layout.addView(button); 
     set.connect(button.getId(), ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 0); 
     set.connect(button.getId(),ConstraintSet.RIGHT,ConstraintSet.PARENT_ID,ConstraintSet.RIGHT,0); 
     set.connect(button.getId(),ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.LEFT,0); 
     set.constrainHeight(button.getId(), 200); 
     set.applyTo(layout); 


     //Button 2: 
     Button newButton = new Button(this); 
     newButton.setText("Yeeey"); 
     layout.addView(newButton); 
     set.connect(newButton.getId(), ConstraintSet.BOTTOM, button.getId(), ConstraintSet.TOP, 0); 
     set.connect(newButton.getId(),ConstraintSet.RIGHT,ConstraintSet.PARENT_ID,ConstraintSet.RIGHT,0); 
     set.connect(newButton.getId(),ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.LEFT,0); 
     set.constrainHeight(newButton.getId(), 200); 
     set.applyTo(layout); 


    } 

Важно:
Если id не s et явно, все элементы получат один и тот же идентификатор (-1).

+0

Отлично. Это рабочий код. Я вижу, что вы добавили «button.setID (100)»; и изменил «layout.getId()» на «ConstraintSet.PARENT_ID». Не могли бы вы объяснить мне, почему это заставило его работать? – Einar

+0

Мы хотим установить нашу кнопку в нижней части родительского макета, поэтому использование «ConstraintSet.PARENT_ID» более подходит и при установке newButton в верхней части кнопки я использовал код перед добавлением button.setId(), и это не было давая мне идеальный результат, поэтому я должен установить id с помощью java-кода. –

+6

Я вижу. Спасибо. Для других, читающих эти комментарии: я напечатал содержимое .getId() для каждой кнопки. Если .setId() не используется, то он по умолчанию присваивает значение ID -1. Это означает, что все ваши кнопки имеют идентификатор -1. В этом случае ваш set.connect() не сможет отличить одну кнопку от другой. – Einar