在ConstraintLayout上调用setLayoutParams不会改变大小

7

故事

我有两个文本视图,一个在另一个上面:

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

我有以上4个要求。使用ConstraintLayout可以很好地实现,其中TextView1的左侧被约束到TextView2的左侧,而TextView2的宽度为wrap_content

但是现在出现了第五个要求:

  • TextView2可以消失,只留下TextView1。

setVisibility(GONE)不起作用,因为TextView2必须是wrap_content。它的宽度将变为0,因此TextView1也会消失(因为它的左侧被约束到TextView2的左侧)。

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

    ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams)textView2.getLayoutParams();
    lp.width = widthInPixelOrConstant;
    textView2.setLayoutParams(lp);

哎呀,什么都没有发生。TextView2还在那里,好像什么也没发生过。
我谷歌了半个小时,最终决定用LinearLayout来包装TextView2。

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

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

......它可行!!!

问题

显然,我们不能再像以前那样使用setLayoutParams来尝试在运行时更改ConstraintLayout子项的高度或宽度。
但是,将TextView2包装在LinearLayout中真的很愚蠢。
有人知道如何在运行时更改ConstraintLayout子项的宽度或高度吗?


你能分享整个布局吗? - Mehmed
1个回答

7

尝试在运行时添加约束,像这样:

//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);

我希望你能从中受益!

这对我不起作用... 不仅高度没有改变,约束也被破坏了。 - Sira Lam
你可以在运行时添加约束条件,并在布局xml中跳过它们,查看我的更新答案,看看是否有什么可以帮助你的。 - Zerato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接