Facebook出品的Android声明式开源新框架Litho文档翻译-Styles

欢迎转载,转载请标明出处.
英文原文文档地址: Litho-doc

兼容性

Styles


Component可以像Android View的属性集的构建器一样,使用Android的style资源来构建它的prop.它让开发者能够直接使用style资源来定义静态的prop值或者prop的默认值.

可以通过在你的Component的Spec中实现@OnLoadStyle方法来支持Style.它的第一个参数是ComponentContext,你可以用它来检索生成一个包含stype资源的TypedArray.其他的参数需要是Output类型,并且名称与类型都与你想要设置的prop相同.

1
2
3
4
5
6
7
8
9
10
11
12
@LayoutSpec
class MyComponentSpec {
@OnCreateLayout
static ComponentLayout onCreateLayout(
ComponentContext c,
@Prop String prop1,
@Prop int prop2) {
return ...;
}
}

举个例子,为了对上面的MyComponent的两个prop实现style的支持,你先要按照惯例定义样式属性:

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="prop1" format="string" />
<attr name="prop2" format="integer" />
<declare-styleable name="MyComponent">
<attr name="prop1" />
<attr name="prop2" />
</declare-styleable>
</resources>

接着你可以在你的@OnLoadStyle方法中收集这些属性的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@OnLoadStyle
void onLoadStyle(
ComponentContext c,
Output<String> prop1,
Output<Integer> prop2) {
final DataBoundTypedArray a =
c.obtainDataBoundAttributes(R.styleable.Text, 0);
for (int i = 0, size = a.getIndexCount(); i < size; i++) {
final int attr = a.getIndex(i);
if (attr == R.styleable.MyComponent_prop1) {
prop1.set(a.getString(attr));
} else if (attr == R.styleable.MyComponent_prop2) {
prop2.set(a.getInteger(attr));
}
}
a.recycle();
}

这样,你就可以在style中定义prop1和prop2的值了:

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="SomeStyle">
<item name="prop1">@string/some_string</item>
</style>
</resources>

并且在MyComponent中使用它:

1
2
3
MyComponent.create(c, 0, R.style.SomeStyle)
.prop2(10)
.build();

这样,prop1就能够从@string/some_string资源中获取值了.




回到导航页