Layout Specs

Layout Spec 与 Android 上的复合View 逻辑等价。它只需现有组件组合到一个不可变的布局树中。

实现 Layout Spec 非常简单:只需编写一个带有 @OnCreateLayout 注解的方法,该方法返回包含 ComponentLayout 对象的不可变树。

我们从一个简单的例子开始:

@LayoutSpec
public class MyComponentSpec {
  @OnCreateLayout
  static Component onCreateLayout(
      ComponentContext c,
      @Prop int color,
      @Prop String title) {

      return Row.create(c)
          .alignItems(CENTER)
          .child(
              SolidColor.create(c)
                  .colorRes(color)
                  .widthDip(40)
                  .heightDip(40))
          .child(
              Text.create(c)
                  .text(title)
                  .textSizeRes(R.dimen.my_text_size)
                  .flexGrow(1f))
          .build();
  }
}

如您所见,Layout Spec 类使用 @LayoutSpec 注释。

使用 @OnCreateLayout 注解的方法必须具有 ComponentContext 作为其第一个参数,后跟使用 @Prop 标注的参数列表。注解处理器将在构建时对参数列表以及API中其他约束条件进行验证。

在上面的示例中,布局树具有一个根容器,带有两个孩子水平叠放( Row.create )并垂直居中( Align.CENTER )。

第一个孩子是一个 SolidColor 组件,接收 colorRes 作为Prop ,并具有40dp的宽度和高度。

SolidColor.create(c)
    .colorRes(color)
    .width(40)
    .height(40)

第二个孩子是一个 Text 组件,接收名为 text 的属性,使用 grow(1f) 填充 MyComponent 中剩余可用的水平空间(等同于 Android 中LinearLayout 中的 layoutWeight)。文本大小在 my_text_size dimension 资源中定义。

Text.create(c)
    .text(title)
    .textSizeRes(R.dimen.my_text_size)
    .grow(1f)

您可以查看完整的 Yoga 文档以查看该框架公布的所有布局功能。

Last updated