LayoutParams会覆盖自己

时间:2019-03-23 01:17:14

标签: android android-constraintlayout android-layoutparams

我正在开发一个小游戏,我需要给不同的ImageViews不同的LayoutParams。因此,我创建了一个数组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 个答案:

答案 0 :(得分:0)

以下语句均返回 same 结构。每次调用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。