Параметры LAYOUT перезаписывают сами себя

#android #android-constraintlayout #android-layoutparams

#Android #android-constraintlayout #android-параметры layoutparams

Вопрос:

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

  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:

Все следующие инструкции возвращают одну и ту же структуру. Вы не получаете новые параметры макета для каждого вызова 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 выполняется последним.

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

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