Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式构建约束布局_Java_Android_Xml_Android Layout_Android Constraintlayout - Fatal编程技术网

Java 以编程方式构建约束布局

Java 以编程方式构建约束布局,java,android,xml,android-layout,android-constraintlayout,Java,Android,Xml,Android Layout,Android Constraintlayout,我试图以编程方式构建约束布局,并且我必须能够随意重新排列布局的各个部分。我将所有的布局放入约束布局并创建指导原则,这样每个视图只占一定的百分比。我已经在下面发布了约束布局的代码,但基本上在我添加了一个视图之后,我创建并添加了与之配套的指南。之后,我将ConstraintSet中“connect”方法的参数放在一个列表中,因为我的理解是,在添加之前需要添加所有视图。添加所有视图后,我从ConstraintLayout克隆ConstraintSet,然后遍历连接所有视图的connect param列

我试图以编程方式构建约束布局,并且我必须能够随意重新排列布局的各个部分。我将所有的布局放入约束布局并创建指导原则,这样每个视图只占一定的百分比。我已经在下面发布了约束布局的代码,但基本上在我添加了一个视图之后,我创建并添加了与之配套的指南。之后,我将ConstraintSet中“connect”方法的参数放在一个列表中,因为我的理解是,在添加之前需要添加所有视图。添加所有视图后,我从ConstraintLayout克隆ConstraintSet,然后遍历连接所有视图的connect param列表……但这不起作用

//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);
}
//mConstraintSets保存了以后连接视图所需的所有信息
受保护的准则createGuideline(){
指南=新指南(mContext);
添加(新的ManifestConstraintSet(guideline.getId(),true));
manifestLayout.addView(指南);
ConstraintLayout.LayoutParams params=(ConstraintLayout.LayoutParams)guideline.getLayoutParams();
params.guidePercent=layoutPercent;//45%-范围:0 1
准则.setLayoutParams(params);
返回指南;
}
//这将为工具栏创建Constant
受保护的void约束工具栏(int-viewID){
高于viewID=viewID;
添加(新的ManifestConstraintSet(viewID,ConstraintSet.START,ConstraintSet.PARENT_ID,ConstraintSet.START,0));
添加(新的ManifestConstraintSet(viewID,ConstraintSet.END,ConstraintSet.PARENT_ID,ConstraintSet.END,0));
添加(新的ManifestConstraintSet(viewID,ConstraintSet.TOP,ConstraintSet.PARENT_ID,ConstraintSet.TOP,0));
}
//这将为视图创建约束
受保护的无效约束视图(int viewID,浮动百分比){
layoutPercent+=百分比;
指南=新指南(mContext);
布尔值isBottomView=false;
//检查该视图是否为底部视图
//如果是这样,不要制定指导方针
如果(布局百分比<1f){
guideline=createGuideline();
}否则{
isBottomView=true;
}
//区域左、右和顶部约束对于每个视图都是相同的
添加(新的ManifestConstraintSet(viewID,ConstraintSet.START,ConstraintSet.PARENT_ID,ConstraintSet.START,0));
添加(新的ManifestConstraintSet(viewID,ConstraintSet.END,ConstraintSet.PARENT_ID,ConstraintSet.END,0));
添加(新的ManifestConstraintSet(viewID,ConstraintSet.TOP,overviewID,ConstraintSet.BOTTOM,0));
高于viewID=viewID;
//端区
if(isBottomView){
添加(新的ManifestConstraintSet(viewID,ConstraintSet.BOTTOM,ConstraintSet.PARENT_ID,ConstraintSet.BOTTOM,0));
}否则{
添加(新的ManifestConstraintSet(viewID,ConstraintSet.BOTTOM,guideline.getId(),ConstraintSet.TOP,0));
}
}
受保护的void addConstraintSetSet(){
manifestConstraintSet.clone(manifestLayout);
for(ManifestConstraintSet:mConstraintSets){
如果(设置ISG指南){
manifestConstraintSet.create(set.startView、ConstraintSet.VERTICAL_指南);
}否则{
manifestConstraintSet.connect(set.startView、set.startPos、set.endView、set.endPos、set.margin);
manifestConstraintSet.ConstraintWidth(set.startView、ConstraintSet.MATCH_CONSTRAINT);
manifestConstraintSet.ConstraintHeight(set.startView、ConstraintSet.MATCH_CONSTRAINT);
}
}
manifestConstraintSet.applyTo(manifestLayout);
}

我不认为我完全理解约束是如何以编程方式工作的。如果重要的话,当我创建视图时,我正在使用静态生成视图id方法来设置它们的id。

是否像ConstraintLayout中的普通视图一样添加了指南?查看和和其他方法来设置指南的位置。我没有看到在你的代码中设置任何指导位置


我将从一个非常简单的布局开始,其中包含一个
TextView
(例如)和一条指导原则,以确保我理解其中的机制。然后我会扩展到完整布局。

我在“addConstraintsToSet”方法中使用create,但我不知道“setGuidelineBegin”,但如果我不确定自己理解了我在做什么,我可能不应该直接跳到这一步。