LayoutParams перезаписывают себя - PullRequest
1 голос
/ 23 марта 2019

Я разрабатываю небольшую игру, и мне нужно дать разные ImageViews разные LayoutParams.Поэтому я создал массив ConstraintLayoutParams.После отдельного изменения свойств параметров макета все параметры макета имеют те же свойства, что и предыдущий.Так что продолжайте переписывать себя.

 p[0] = (ConstraintLayout.LayoutParams) card2.getLayoutParams();     
 p[0].startToStart=R.id.plazertxt1;
Toast.makeText(getApplicationContext(),String.valueOf(p[0].startToStart),Toast.LENGTH_LONG).show();  
 // shows 2131165282
        p[1] = (ConstraintLayout.LayoutParams) card2.getLayoutParams();
        p[1].startToStart=R.id.plazertxt2;
        p[2] = (ConstraintLayout.LayoutParams) card2.getLayoutParams();
        p[2].startToStart=R.id.plazertxt3;
        p[3] = (ConstraintLayout.LayoutParams) card2.getLayoutParams();
        p[3].startToStart=R.id.plazertxt4;
  Toast.makeText(getApplicationContext(),String.valueOf(p[0].startToStart)+","+String.valueOf(p[1].startToStart)+","+String.valueOf(p[2].startToStart)+","+String.valueOf(p[3].startToStart)+",",Toast.LENGTH_LONG).show();
//shows 2131165285,2131165285,2131165285,2131165285

Ожидаемый результат для последнего тоста должен быть

"2131165282,2131165283,2131165284,2131165285"

Но это

"2131165285,2131165285,2131165285,2131165285"

1 Ответ

0 голосов
/ 23 марта 2019

Все следующие операторы возвращают одинаковую структуру.Вы не получаете новые параметры макета для каждого вызова getLayoutParams().

p[1] = (ConstraintLayout.LayoutParams) card2.getLayoutParams();
p[2] = (ConstraintLayout.LayoutParams) card2.getLayoutParams();
p[3] = (ConstraintLayout.LayoutParams) card2.getLayoutParams();

Итак, после этих трех строк p[1] == p[2] == p[3].Когда выполняются следующие строки:

p[1].startToStart=R.id.plazertxt2;
p[2].startToStart=R.id.plazertxt3;
p[3].startToStart=R.id.plazertxt4;

, тогда p[1] == p[2] == p[3] == R.id.plazertxt4, поскольку p[3].startToStart=R.id.plazertxt4 выполняется последним.

Это немного сбивает с толку, но это то, что происходит.Вам следует избегать использования параметров макета для установки ограничений, но вместо этого используйте ConstraintSet .

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

...