ConstraintLayout上的setLayoutParams不会更改大小

时间:2017-10-20 09:09:17

标签: android android-constraintlayout

故事

我有2个文字视图,一个在另一个上面:

XXXXXXXXXXXX[TextView1]
XXXXXXXXXXXX[TextView2]
  • 两个TextView都向右对齐。 (因此上面的XXX)
  • TextView1具有背景色。
  • TextView2始终比TextView1
  • TextView1左侧必须与TextView2对齐

我有以上4项要求。现在一切都运行良好,使用ConstraintLayout,其中TextView1左侧约束为TextView2左侧,TextView2的宽度为wrap_content

但现在是第5项要求:

  • TextView2可以消失,留下TextView1。

setVisibility(GONE)不起作用,因为TextView2必须为wrap_content。它的宽度将变为0,因此也是TextView1(因为它的左侧被限制为TextView2' s左侧)

然后我尝试使用以下代码将TextView2的高度设置为0:

    ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams)textView2.getLayoutParams();
    lp.width = widthInPixelOrConstant;
    textView2.setLayoutParams(lp);
哎呀,没有任何反应。 TextView2仍然存在,好像什么也没发生。 我用Google搜索了半个小时,最后决定将TextView2换成LinearLayout

然后使用下面的代码将TextView2的高度设置为0:

    LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams )view.getLayoutParams();
    lp.width = widthInPixelOrConstant;
    view.setLayoutParams(lp);

......它有效!!!

问题

因此,显然,我们不能使用之前使用的内容 - setLayoutParams来尝试在运行时改变ConstraintLayout的子节点的高度或宽度。
但是,将TextView2包装在LinearLayout中实际上是非常愚蠢的 有谁知道如何在运行时更改ConstraintLayout的子宽度或高度?

1 个答案:

答案 0 :(得分:2)

尝试在运行时添加约束,如下所示:

//Define some variables
TextView textView1;
TextView textView2;
ConstraintLayout constraintLayout;

//Initialize them, and so some stuff
textView1 = (TextView) findViewById(R.id.text1);
textView2 = (TextView) findViewById(R.id.text2);
constraintLayout = (ConstraintLayout) findViewById(R.id.constraintLayout);

int x = 200; //set some width
int y = 200; //Set some height        

ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(
            ConstraintLayout.LayoutParams.WRAP_CONTENT,
            ConstraintLayout.LayoutParams.WRAP_CONTENT);

lp.width = x;
lp.height = y;

//moves TextView1's left to align with TextView2's left
lp.editorAbsoluteX = ((int) textView2.getX());     

textView1.setLayoutParams(lp);

ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(constraintLayout);        

constraintSet.connect(R.id.text1,ConstraintSet.LEFT,R.id.text2,ConstraintSet.LEFT,0);
constraintSet.connect(R.id.text2,ConstraintSet.TOP,R.id.text1,ConstraintSet.BOTTOM,0);

constraintSet.applyTo(constraintLayout);

我希望有所帮助!