0

我對運行時生成的UI沒有遵循約束有些困難。根據Android的其他答案和文檔,我嘗試了ConstraintSet以及其他一些方法。對LinearLayout中的ConstraintLayout執行運行時約束

我正在擴展ConstraintLayout,以獲得在應用程序功能中具有組成部分的自定義類。我從Web服務器獲取數據,然後創建這些對象並將它們添加到LinearLayoutLinearLayout,ConstraintLayoutTextView都顯示其正確的大小;然而,TextView彼此重疊並拒絕遵守任何限制。

我可以通過佈局編輯器手動創建一個我想要做的副本,它工作正常。

我的當前設置(this延伸ConstraintLayout,text_nametext_pointsTextView S):

this.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 

    this.addView(text_name); 
    this.addView(text_points); 

    ConstraintSet constraints = new ConstraintSet(); 

    constraints.clone(this); 

    constraints.constrainHeight(text_points.getId(), WRAP_CONTENT); 
    constraints.constrainWidth(text_points.getId(), WRAP_CONTENT); 
    constraints.constrainHeight(text_name.getId(), WRAP_CONTENT); 
    constraints.constrainWidth(text_name.getId(), WRAP_CONTENT); 

    constraints.connect(text_name.getId(), LEFT, getId(), LEFT); 
    constraints.connect(text_points.getId(), RIGHT, getId(), RIGHT); 

    constraints.applyTo(this); 

constrainWidthconstrainHeight工作;當我擺脫它們或改變它們的值時,它會產生效果。然而,connect業務中的任何一個都沒有做任何事情。 TextView的文字大小合適,但不符合任何限制條件。我錯過了一些使.connect工作的線?

澄清:我有ScrollViewLinearLayoutConstraintLayoutTextView s。在編輯器中創建時,約束可以正常工作。在運行時使用ConstraintSetConstraintLayout的實例化中創建時,連接的約束不起作用,但其他屬性可以。

Display in-app - TextViews overlap, not following constraints

編輯:只是爲了確認,這裏加入的LinearLayout(LOCS)行#的輸出,在的LinearLayout(LDIM)的大小,ConstraintLayout(LOCDIM)的大小和尺寸在TextViews(TVDIM,TV2DIM):

09-03 14:19:18.664 D/LOCS: 2 
09-03 14:19:18.665 D/LDIM: 1080 w 
09-03 14:19:18.665 D/LDIM: 58 h 
09-03 14:19:18.665 D/LOCDIM: 1080 w 
09-03 14:19:18.666 D/LOCDIM: 29 h 
09-03 14:19:18.667 D/TVDIM: 165 w 
09-03 14:19:18.667 D/TVDIM: 29 h 
09-03 14:19:18.668 D/TV2DIM: 29 w 
09-03 14:19:18.668 D/TV2DIM: 29 h 

回答

0

的問題是,編程,視圖ID不正確分配。我在嘗試邊距,寬度,高度,比例和旋轉的不同組合時發現了這一點 - 兩個視圖都應用了相同的更改。

解決方案是通過以某種方式生成ID來自己設置ID。但是,不允許使用低API版本(< 17),View.generateViewId();因此,你必須使用纏着那些不幸的是醜陋的區塊之一:

int view_id; 

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { 
    view_id = View.generateViewId(); 
} else { 
    view_id = new Random(System.currentTimeMillis()).nextInt(); 
} 

view.setId(view_id); 

從此,你可以使用view_idview.getId()ConstraintSet

對於要添加到ConstraintLayoutView的父級,您可以使用ConstraintSet.PARENT_ID

0

看到這個答案,我認爲你缺少的clone()指令。

Add view programatically in ConstraintLayout

+0

沒有這個運氣。是否有可能在第一次渲染後才能完成? –

+0

我假設的這些方法用於onCreate Activity方法或onCreateView Fragment方法。我從來沒有嘗試過它作爲視圖的一部分。如果您發佈佈局,我可能會提供更多信息。我認爲你嘗試的方式更復雜。 – Juan

+0

我正在從給定設備當前位置的Web服務器流式傳輸數據。之前已經完成動態加載數據!佈局如前所述 - ScrollView - > LinearLayout - ConstraintLayout - TextView。加載數據時創建ConstraintLayout和TextViews。擴展ConstraintLayout自定義構造函數以傳遞數據。上面的代碼片段來自擴展類的構造函數。 –