@Retention(value=SOURCE)
public @interface OnShouldCreateLayoutWithNewSizeSpec
OnCreateLayoutWithSizeSpec. The annotated method must have the following
signature:
static boolean onShouldCreateLayoutWithNewSizeSpec(
ComponentContext c,
int newWidthSpec,
int newHeightSpec, ...)
The annotated method should return true iff the Layout Spec should create a new layout
for this new size spec. If the method returns false then the Component will use the last
cached layout.
For example:
@LayoutSpec
class MyComponentSpec {
@OnCreateLayoutWithSizeSpec
static Component onCreateLayoutWithSizeSpec(
ComponentContext c,
int widthSpec,
int heightSpec) {
final Component textComponent =
Text.create(c).textSizeSp(16).text("Some text to measure.").build();
// UNSPECIFIED sizeSpecs will measure the text as being one line only,
// having unlimited width.
final Size textOutputSize = new Size();
textComponent.measure(
c,
SizeSpec.makeSizeSpec(0, UNSPECIFIED),
SizeSpec.makeSizeSpec(0, UNSPECIFIED),
textOutputSize);
// Small component to use in case textComponent does not fit within the current layout.
final Component imageComponent = Image.create(c).drawableRes(R.drawable.ic_launcher).build();
// Assuming SizeSpec.getMode(widthSpec) == EXACTLY or AT_MOST.
final int layoutWidth = SizeSpec.getSize(widthSpec);
final boolean textFits = (textOutputSize.width <= layoutWidth);
return textFits ? textComponent : imageComponent;
}
@OnShouldCreateLayoutWithNewSizeSpec
static boolean onShouldCreateLayoutWithNewSizeSpec(
ComponentContext c,
int newWidthSpec,
int newHeightSpec,
@FromPreviousCreateLayout int textWidth,
@FromPreviousCreateLayout boolean didItFit) {
final int newLayoutWidth = SizeSpec.getSize(newWidthSpec);
final boolean doesItStillFit = (textWidth <= newLayoutWidth);
// false if it still fits or if still doesn't fit
return doesItStillFit ^ didItFit;
}
}