【问题标题】:setLayoutParams on ConstraintLayout does not change sizeConstraintLayout 上的 setLayoutParams 不会改变大小
【发布时间】:2018-04-01 10:24:08
【问题描述】:

故事

我有 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 也将变为 0(因为它的左侧被限制在 TextView2 的左侧)

然后我尝试使用以下代码将 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 的子宽度或高度?

【问题讨论】:

  • 你能分享整个布局吗?

标签: android android-constraintlayout


【解决方案1】:

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

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

希望对你有帮助!

【讨论】:

  • 这对我不起作用...不仅高度没有改变,约束也被打破了。
  • 您可以在运行时添加约束,并在布局 xml 中跳过它们,检查我更新的答案,看看是否有什么可以帮助您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 2020-02-02
  • 2021-05-01
  • 2018-09-28
  • 1970-01-01
  • 2016-05-30
相关资源
最近更新 更多