2017-10-20 109 views
2

故事setLayoutParams不会改变大小,

我有2个textviews,一个在另一个之上:

XXXXXXXXXXXX[TextView1] 
XXXXXXXXXXXX[TextView2] 
  • 两个TextViews对齐的权利。 (因此上面的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保持在那里,就好像什么都没有发生。 我谷歌搜索了半个小时,最后决定将TextView2换成LinearLayout

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

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

......它的工作原理!

问题

所以,很显然,我们不能用我们之前使用 - setLayoutParams尝试改变ConstraintLayout的孩子的高度或宽度在运行。
但是,将TextView2包装到LinearLayout中确实很愚蠢。
有谁知道如何在运行时更改ConstraintLayout的子宽度或高度?

+0

你能分享整个布局吗? – Mehmed

回答

0

尝试在运行时添加的限制,像这样:

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

我希望帮助!

+0

这对我不起作用......不仅高度不变,限制也被打破。 –

+0

您可以在运行时添加约束条件,并在布局xml中跳过它们,检查我更新的答案,并查看是否有可以帮助您的东西。 – Zerato

相关问题