android - 使用 ConstraintLayout 以编程方式连接设置为任意大小的多个 View

标签 android android-layout programmatically-created android-constraintlayout

我正在使用 ConstraintLayout beta4 并尝试以编程方式在屏幕上创建水平链。

我遇到的问题是当我在屏幕上将多个 View 连接在一起时 (ex: Left side of layout <-> leftButton <-> rightButton <-> Right side of layout) 然后什么也没有出现。

这是不起作用的代码:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ConstraintLayout layout = (ConstraintLayout) View.inflate(this, R.layout.activity_main, null);
    setContentView(layout);

    ConstraintSet set = new ConstraintSet();
    set.clone(layout);

    ConstraintLayout.LayoutParams anySizeParams = new ConstraintLayout.LayoutParams(0,0);

    ImageButton leftButton = new ImageButton(this);
    leftButton.setId(View.generateViewId());
    leftButton.setLayoutParams(anySizeParams);
    layout.addView(leftButton);

    ImageButton rightButton = new ImageButton(this);
    rightButton.setId(View.generateViewId());
    rightButton.setLayoutParams(anySizeParams);
    layout.addView(rightButton);

    set.connect(leftButton.getId(),ConstraintSet.LEFT,layout.getId(),ConstraintSet.LEFT,0);
    set.connect(leftButton.getId(),ConstraintSet.RIGHT,rightButton.getId(),ConstraintSet.LEFT,0);
    set.connect(leftButton.getId(),ConstraintSet.TOP,layout.getId(),ConstraintSet.TOP,0);
    set.connect(leftButton.getId(),ConstraintSet.BOTTOM,layout.getId(),ConstraintSet.BOTTOM,0);

    set.connect(rightButton.getId(),ConstraintSet.LEFT,rightButton.getId(),ConstraintSet.RIGHT,0);
    set.connect(rightButton.getId(),ConstraintSet.RIGHT,layout.getId(),ConstraintSet.RIGHT,0);
    set.connect(rightButton.getId(),ConstraintSet.TOP,layout.getId(),ConstraintSet.TOP,0);
    set.connect(rightButton.getId(),ConstraintSet.BOTTOM,layout.getId(),ConstraintSet.BOTTOM,0);

    set.applyTo(layout);

}
}

这是上述代码的屏幕截图:programmatically created .

下面是一些描述相同内容并且工作正常的 xml,供引用:

<ImageButton
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:id="@+id/right_button"
    app:layout_constraintLeft_toRightOf="@+id/left_button"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent" />

<ImageButton
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:id="@+id/left_button"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toLeftOf="@+id/right_button"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"/>

这是 xml 的屏幕截图:manually created

最佳答案

您所做的事情存在一些问题。首先,您将相同的 LayoutParams 实例分配给两个对象——这是行不通的。您需要一个单独的实例:

ConstraintLayout.LayoutParams anySizeParams2 = new ConstraintLayout.LayoutParams(0, 0);
rightButton.setLayoutParams(anySizeParams2);

其次,你的连接错误:

set.connect(rightButton.getId(),ConstraintSet.LEFT,
            rightButton.getId(),ConstraintSet.RIGHT,0);

应该是:

set.connect(rightButton.getId(),ConstraintSet.LEFT,
            leftButton.getId(),ConstraintSet.RIGHT,0);

否则它不会创建一条链。

在添加 View 后克隆布局可能会更清晰。

关于android - 使用 ConstraintLayout 以编程方式连接设置为任意大小的多个 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41643597/

相关文章:

java - 以编程方式创建一个新的 Xtext 项目

java - Android 5 中的图像内存不足

android - 如何在 AlertDialog 中添加多个 EditText 对象

android - 在没有完成()的情况下重新加载 Android 中的 Activity

android - 如何在软键盘上方设置布局

Android 自定义通知不显示代码更改

java - 在 RecyclerView 中重置先前 CardView 的颜色

android - Android 6.0 处于打盹模式时如何让闹钟管理器工作?

iphone - 以编程方式设置 UIButton 的 buttonType