ConstraintLayout 上的 setLayoutParams 不改变大小
setLayoutParams on ConstraintLayout does not change size
故事
我有 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 的子宽度或高度?
尝试在运行时添加约束,如下所示:
//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);
希望对您有所帮助!
故事
我有 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 的子宽度或高度?
尝试在运行时添加约束,如下所示:
//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);
希望对您有所帮助!