2017-10-26 12 views
1

制約レイアウトをプログラムで構築しようとしていますが、レイアウトの部分を自由に並べ替えることができなければなりません。私はすべてのレイアウトを制約レイアウトに配置し、各ビューが特定の割合しか取らないようにガイドラインを作成しています。私は以下の制約レイアウトのコードを掲載しましたが、基本的にビューを追加した後、それを作成して追加します。その後、すべてのビューを追加する必要があることを理解していたので、ConstraintSetの 'connect'メソッドのパラメータをリストに入れました。すべてのビューが追加された後、私はConstraintLayoutからConstraintSetを複製してから、すべてのビューを接続する接続パラメータリストを反復処理しますが、それはうまく動作しません。プログラムで制約レイアウトを作成する

//mConstraintSets holds all info needed to connect the views later 

protected Guideline createGuideline(){ 
     Guideline guideline = new Guideline(mContext); 
     mConstraintSets.add(new ManifestConstraintSet(guideline.getId(), true)); 
     manifestLayout.addView(guideline); 
     ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) guideline.getLayoutParams(); 
     params.guidePercent = layoutPercent; // 45% - range: 0 <-> 1 
     guideline.setLayoutParams(params); 
     return guideline; 
    } 

//This will create the constaint for the toolbar 
protected void constraintToolbar(int viewID){ 
    aboveViewID = viewID; 

    mConstraintSets.add(new ManifestConstraintSet(viewID, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, 0)); 
    mConstraintSets.add(new ManifestConstraintSet(viewID, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END, 0)); 
    mConstraintSets.add(new ManifestConstraintSet(viewID, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0)); 

} 

//This will create the constraint for a view 
protected void constraintView(int viewID, float percent){ 
    layoutPercent += percent; 
    Guideline guideline = new Guideline(mContext); 
    Boolean isBottomView = false; 

    //Check if the view is the bottom view 
    //if so don't create a guideline 
    if(layoutPercent < 1f){ 
     guideline = createGuideline(); 
    }else{ 
     isBottomView = true; 
    } 

    //region left, right, & top constraints are the same for every view 
    mConstraintSets.add(new ManifestConstraintSet(viewID, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, 0)); 
    mConstraintSets.add(new ManifestConstraintSet(viewID, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END, 0)); 
    mConstraintSets.add(new ManifestConstraintSet(viewID, ConstraintSet.TOP, aboveViewID, ConstraintSet.BOTTOM, 0)); 
    aboveViewID = viewID; 
    //endregion 

    if(isBottomView){ 
     mConstraintSets.add(new ManifestConstraintSet(viewID, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 0)); 

    }else{ 
     mConstraintSets.add(new ManifestConstraintSet(viewID, ConstraintSet.BOTTOM, guideline.getId(), ConstraintSet.TOP, 0)); 
    } 
} 

protected void addConstraintsToSet(){ 
    manifestConstraintSet.clone(manifestLayout); 

    for (ManifestConstraintSet set:mConstraintSets) { 
     if(set.isGuideline){ 
      manifestConstraintSet.create(set.startView, ConstraintSet.VERTICAL_GUIDELINE); 
     }else{ 
      manifestConstraintSet.connect(set.startView, set.startPos, set.endView, set.endPos, set.margin); 
      manifestConstraintSet.constrainWidth(set.startView, ConstraintSet.MATCH_CONSTRAINT); 
      manifestConstraintSet.constrainHeight(set.startView, ConstraintSet.MATCH_CONSTRAINT); 
     } 

    } 
    manifestConstraintSet.applyTo(manifestLayout); 
} 

私はConstraintLayoutsが実際にプログラムでどのように動作するかを完全に理解しているとは思いません。それが重要な場合は、ビューを作成するときに私はスタティックIDを設定するためにビューIDメソッドを生成しています。

答えて

1

通常の表示のようにガイドラインを追加しましたか?ConstraintLayoutcreatesetGuidelineBeginを参照して、ガイドラインの配置場所を設定します。あなたのコードにガイドラインの位置が設定されていません。

まず、TextViewという単一の非常に単純なレイアウトから開始し、その仕組みを理解するためのガイドラインを1つ作成します。私は完全なレイアウトに拡張します。

+0

私は 'addConstraintsToSet'メソッドでcreateを使用していますが、私は 'setGuidelineBegin'を認識していませんでしたが、おそらく私が何をしているのかを理解することなくこれに直接ジャンプしてはいけません。 –

関連する問題