如何以编程方式更改约束布局的子视图约束

时间:2017-06-25 18:50:05

标签: android android-layout

我想以编程方式更改togglebutton的约束,但我已经为xml文件中的togglebutton设置了约束。我需要的是当我点击togglebutton时我想覆盖togglebutton的约束,即当我点击在togglebutton1然后从togglebutton2的左侧添加约束,使用togglebutton3的左侧并且结果为0。

private ToggleButton toggleButton1;
private ToggleButton toggleButton2;
private ToggleButton toggleButton3;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toggleButton1 = (ToggleButton) findViewById(R.id.toggleButton1);
    toggleButton2 = (ToggleButton) findViewById(R.id.toggleButton2);
    toggleButton3 = (ToggleButton) findViewById(R.id.toggleButton3);

    CompoundButton.OnCheckedChangeListener compoundButton = new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                ConstraintLayout constraintLayout = (ConstraintLayout) findViewById(R.id.constraintLayout); 
                ConstraintSet set = new ConstraintSet();
                set.clone(constraintLayout);
                set.connect(toggleButton3.getId(),ConstraintSet.LEFT,toggleButton2.getId(),ConstraintSet.LEFT,0);
                set.applyTo(constraintLayout);
            } else
               // somecode
        }
    };
    toggleButton1.setOnCheckedChangeListener(compoundButton);
}
希望有人帮助我

1 个答案:

答案 0 :(得分:1)

我没有为您提供解决方案,但我可以向您展示一些令我信服的信息,即连接无法正确/向左,因为它的顶部/底部。将您的OnCheckedChangeListener代码更改为以下代码并运行它。

    CompoundButton.OnCheckedChangeListener compoundButton = new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            ConstraintLayout constraintLayout = (ConstraintLayout) findViewById(R.id.constraintLayout);
            ConstraintSet set = new ConstraintSet();
            set.clone(constraintLayout);
            if (isChecked) {
                set.connect(toggleButton3.getId(), ConstraintSet.LEFT, toggleButton2.getId(), ConstraintSet.LEFT, 0);
            } else {
                set.connect(toggleButton3.getId(), ConstraintSet.BOTTOM, toggleButton2.getId(), ConstraintSet.BOTTOM, 0);
            }
            set.applyTo(constraintLayout);
        }
    };

首次点击toggleButton1时,您将看不到更改。当您再次单击它时,您应该看到toggleButton3跳转,使其底部与toggleButton2的底部对齐。 (确保它没有排成一行。)

您的问题可能与this bug report有关。

如果您确实找到了解决方案,那么您可以将其作为答案发布在此处,因为我已多次遇到此问题。

我希望有所帮助。

修改 您可以采取以下措施来解决此问题。使用ConstraintSet.STARTConstraintSet.END代替ConstraintSet.LEFTConstraintSet.RIGHT。我刚尝试过,它运作正常。我不能说为什么左右不能工作。