是否交换了createHorizo​​ntalChain和createHorizo​​ntalChainRtl?

Edu*_*eis 5 android android-layout android-constraintlayout

我试图用编程方式创建一个约束链,使用下面的代码.

set.createHorizontalChain(
                ConstraintSet.PARENT_ID, ConstraintSet.START,
                ConstraintSet.PARENT_ID, ConstraintSet.END,
                new int[] {view1.getId(), view2.getId()},
                null,
                ConstraintSet.CHAIN_PACKED
        );
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

 Caused by: java.lang.IllegalArgumentException: Left to start undefined
                                                     at android.support.constraint.ConstraintSet.connect(ConstraintSet.java:922)
                                                     at android.support.constraint.ConstraintSet.createHorizontalChain(ConstraintSet.java:883)
                                                     at android.support.constraint.ConstraintSet.createHorizontalChain(ConstraintSet.java:850)
Run Code Online (Sandbox Code Playgroud)

然后我意识到这个方法的实现如下:

public void createHorizontalChain(int leftId, int leftSide, int rightId, int rightSide, int[] chainIds, float[] weights, int style) {
        this.createHorizontalChain(leftId, leftSide, rightId, rightSide, chainIds, weights, style, 1, 2);
    }

    public void createHorizontalChainRtl(int startId, int startSide, int endId, int endSide, int[] chainIds, float[] weights, int style) {
        this.createHorizontalChain(startId, startSide, endId, endSide, chainIds, weights, style, 6, 7);
    }
Run Code Online (Sandbox Code Playgroud)

我应该使用createHorizontalChainRtl哪个似乎有用,因为6和7是值,START并且END意味着这是一个错误,或者我在这里做错了什么?

说真的,以ConstraintLayout编程方式处理真的很有挑战性.

Har*_*jem 6

你应该使用它

set.createHorizontalChain(
            ConstraintSet.PARENT_ID, ConstraintSet.RIGHT,
            ConstraintSet.PARENT_ID, ConstraintSet.LEFT,
            new int[] {ITEM_ID_1, ITEM_ID_2},
            null ,
            ConstraintSet.CHAIN_SPREAD);
Run Code Online (Sandbox Code Playgroud)

这将在所有项目之间创建一个链.如果您的项目是在XML中创建的,那么您可能需要清除已应用的ConstrainSet,方法是使用ConstrainSet.Clear(ITEM_ID)获取新的约束集.然后开始新的约束集规则.

如果清除项目的constrainSet,则不要忘记添加

set.constrainWidth(ITEM_ID, ConstraintSet.WRAP_CONTENT);
set.constrainHeight(ITEM_ID, ConstraintSet.WRAP_CONTENT);
Run Code Online (Sandbox Code Playgroud)

最后别忘了 .applyTo

set.applyTo(constraintLayout);
Run Code Online (Sandbox Code Playgroud)

这是一个相当好的例子,但这个人过早地将所有项目连接起来,这是不必要的.Horizo​​ntalChain示例

Horizo​​ntalChain

这里有关于链式的更多细节

链式

这里还有一个关于如何在代码中使用constrainlayout 的Wiki.

  • 我想也许在 createHorizo​​ntalChain 调用示例中左右翻转了?但谢谢你的例子,让我足够接近认识到这一点:) (2认同)