首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式进行Android约束布局?

以编程方式进行Android约束布局?
EN

Stack Overflow用户
提问于 2016-09-03 00:04:27
回答 2查看 49.4K关注 0票数 43

在iOS中,我非常喜欢删除故事板,并使用制图框架在代码中展示所有内容。这是从地图学的github窃取的:

代码语言:javascript
复制
constrain(view1, view2) { view1, view2 in
    view1.width   == (view1.superview!.width - 50) * 0.5
    view2.width   == view1.width - 50
    view1.height  == 40
    view2.height  == view1.height
    view1.centerX == view1.superview!.centerX
    view2.centerX == view1.centerX

    view1.top >= view1.superview!.top + 20
    view2.top == view1.bottom + 20
}

Android有没有类似的东西?看起来新的约束布局是朝着正确方向迈出的一步,但我想通过编程来实现它。

EN

回答 2

Stack Overflow用户

发布于 2016-10-14 02:53:01

虽然有点晚,但您需要基本上将约束布局中的视图视为具有自己的LayoutParams的常规视图。

在ConstraintLayout案例中,文档位于以下位置:https://developer.android.com/reference/androidx/constraintlayout/widget/ConstraintLayout.LayoutParams

这个类包含不同的属性,指定视图在ConstraintLayout中的布局方式。要在运行时构建约束,建议使用ConstraintSet。

因此,推荐的方法是使用ConstraintSet

这里有一个很好的代码示例,但核心概念是您需要创建一个新的集合(通过复制/克隆/新建等方式),设置其属性,然后将其应用于您的布局。

例如:假设您的布局包含一个ConstraintLayout (这里称为mConstraintLayout ),而它内部又包含一个视图(示例中为R.id.go_button),您可以这样做:

代码语言:javascript
复制
    ConstraintSet set = new ConstraintSet();

    // You may want (optional) to start with the existing constraint,
    // so uncomment this.
    // set.clone(mConstraintLayout); 

    // Resize to 100dp
    set.constrainHeight(R.id.go_button, (int)(100 * density));
    set.constrainWidth(R.id.go_button, (int)(100 * density));

    // center horizontally in the container
    set.centerHorizontally(R.id.go_button, R.id.rootLayout);

    // pin to the bottom of the container
    set.connect(R.id.go_button, BOTTOM, R.id.rootLayout, BOTTOM, 8);

    // Apply the changes
    set.applyTo(mConstraintLayout); 
    // this is my… (ConstraintLayout) findViewById(R.id.rootLayout);
票数 72
EN

Stack Overflow用户

发布于 2019-01-09 19:29:51

我遇到了来自iOS的完全相同的困境,在那里我觉得以编程方式构建视图是一种更常见的做法。

实际上,我正在使用Kotlin hereStevia库移植到android上,因为新的ConstraintLayout与我们心爱的Autolayout非常相似。

下面是如何定义一个简单视图

代码语言:javascript
复制
class MyView(context: Context): ConstraintLayout(context) {

  val label = TextView(context)

  init {

      // View Hierarchy
      subviews(
          label
      )

      // Layout
      label.centerInParent()

      // Style
      label.style {
          textSize = 12F
      }
  }}

请注意,这是引擎盖下的纯本机约束布局,正如Martin的回答所解释的那样。

这只是一个开始,但到目前为止,它已经被证明是用Kotlin编写android视图的一种令人愉快的方式,所以我想我应该分享一下。希望这能有所帮助:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39296627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档