java - 以编程方式构建约束布局

标签 java android xml android-layout android-constraintlayout

我正在尝试以编程方式构建约束布局,并且我必须能够随意重新排列布局的各个部分。我将所有布局放入约束布局中并创建指南,以便每个 View 仅占用一定的百分比。我已经在下面发布了约束布局内容的代码,但基本上在添加 View 之后,我创建并添加了与之相关的指南。之后,我将 ConstraintSet 中“connect”方法的参数放在一个列表中,因为据我了解,在此之前需要添加所有 View 。添加所有 View 后,我从 ConstraintLayout 克隆 ConstraintSet,然后迭代连接所有 View 的连接参数列表...但这不起作用。

//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 如何真正以编程方式工作。如果重要的话,当我创建 View 时,我使用静态生成 View id 方法来设置它们的 id。

最佳答案

是否像 ConstraintLayout 中的普通 View 一样添加了指南?看看createsetGuidelineBegin以及其他方法来设置指南的位置。我没有在您的代码中看到任何指导位置设置。

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

关于java - 以编程方式构建约束布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46958244/

相关文章:

android - Prograurd 重复的 zip 条目

Android/Firebase - 在 GCM 事件中解析时间戳时出错 - 时间戳为空

php - SimpleXML 解析具有相同名称和属性的子项

android - 使用android :onClick in XML调用需要参数的方法

python - 使用 python 迭代解析大型 XML

java - 如何从字符串请求生成序列?

java - 如何在java中读取文本文件的第一行并打印出来?

java - 安卓工作室 : ExpandableListView and EditText

java print方法,字符串类的格式方法困惑

java - 使用Lombok库,但如何自定义/重写setter方法