2017-10-20 107 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

相關問題