#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.