制約レイアウトをプログラムで構築しようとしていますが、レイアウトの部分を自由に並べ替えることができなければなりません。私はすべてのレイアウトを制約レイアウトに配置し、各ビューが特定の割合しか取らないようにガイドラインを作成しています。私は以下の制約レイアウトのコードを掲載しましたが、基本的にビューを追加した後、それを作成して追加します。その後、すべてのビューを追加する必要があることを理解していたので、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メソッドを生成しています。
私は 'addConstraintsToSet'メソッドでcreateを使用していますが、私は 'setGuidelineBegin'を認識していませんでしたが、おそらく私が何をしているのかを理解することなくこれに直接ジャンプしてはいけません。 –