material-components/material-components-android · error · IllegalArgumentException
Invalid sheet edge position value: %d. Must be %d or %d.
Error message
Invalid sheet edge position value: %d. Must be %d or %d.
What it means
SideSheetBehavior's sheet-edge setter throws IllegalArgumentException for any value other than EDGE_LEFT or EDGE_RIGHT. The edge determines which SheetDelegate (left/right) owns layout and drag math, so an unknown gravity int has no delegate and is rejected during validation.
Source
Thrown at lib/java/com/google/android/material/sidesheet/SideSheetBehavior.java:198
if (shapeAppearanceModel != null && !hasRightMargin()) {
ShapeAppearanceModel.Builder builder = shapeAppearanceModel.toBuilder();
builder.setTopRightCornerSize(0).setBottomRightCornerSize(0);
updateMaterialShapeDrawable(builder.build());
}
return;
}
if (sheetEdge == EDGE_LEFT) {
this.sheetDelegate = new LeftSheetDelegate(this);
if (shapeAppearanceModel != null && !hasLeftMargin()) {
ShapeAppearanceModel.Builder builder = shapeAppearanceModel.toBuilder();
builder.setTopLeftCornerSize(0).setBottomLeftCornerSize(0);
updateMaterialShapeDrawable(builder.build());
}
return;
}
throw new IllegalArgumentException(
"Invalid sheet edge position value: "
+ sheetEdge
+ ". Must be "
+ EDGE_RIGHT
+ " or "
+ EDGE_LEFT
+ ".");
}
}
@GravityInt
private int getGravityFromSheetEdge() {
if (sheetDelegate != null) {
return sheetDelegate.getSheetEdge() == Sheet.EDGE_RIGHT ? Gravity.RIGHT : Gravity.LEFT;
}
return Gravity.RIGHT;
}
View on GitHub (pinned to ac7e18efee)
Solutions
- Pass only SideSheetBehavior.EDGE_LEFT or SideSheetBehavior.EDGE_RIGHT.
- Validate persisted values before use: if (edge != EDGE_LEFT && edge != EDGE_RIGHT) edge = EDGE_RIGHT;
- Map UI option ids to the two constants explicitly instead of forwarding raw ints.
Example fix
// before
behavior.setSheetEdge(prefs.getInt("sheet_edge", Gravity.BOTTOM)); // invalid
// after
int saved = prefs.getInt("sheet_edge", SideSheetBehavior.EDGE_RIGHT);
behavior.setSheetEdge(
saved == SideSheetBehavior.EDGE_LEFT ? SideSheetBehavior.EDGE_LEFT
: SideSheetBehavior.EDGE_RIGHT); Defensive patterns
Strategy: validation
Validate before calling
static boolean isValidSheetEdge(int edge) {
return edge == SideSheetBehavior.EDGE_LEFT || edge == SideSheetBehavior.EDGE_RIGHT;
}
// usage
if (isValidSheetEdge(edge)) behavior.setSheetEdge(edge); Prevention
- Never forward persisted or user-supplied ints straight into setSheetEdge.
- Store the edge as a boolean/enum and map to the two constants at the call site.
When it happens
Trigger: Calling setSheetEdge(...) with a raw gravity like Gravity.BOTTOM, Gravity.TOP, or an undefined int, or reading an edge constant from a bundle/preferences that maps to an unexpected value after deserialization.
Common situations: Persisting the sheet edge as an int and restoring a stale/invalid value across app versions; passing GravityCompat constants that don't match; UI that lets users pick an edge and forwards an unvalidated id.
Related errors
- Invalid state to get outer edge offset: %d
- There must be a keyline marked as focal.
- No color resources provided for harmonization.
- Theme overlay should be used with the accompanying int[] att
- start Month cannot be after current Month
AI-assisted analysis of material-components/material-components-android@ac7e18efee (2026-08-14).
Data as JSON: /api/errors/d67f13bb9b4b0654.
Report an issue: GitHub.