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

  1. Pass only SideSheetBehavior.EDGE_LEFT or SideSheetBehavior.EDGE_RIGHT.
  2. Validate persisted values before use: if (edge != EDGE_LEFT && edge != EDGE_RIGHT) edge = EDGE_RIGHT;
  3. 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

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


AI-assisted analysis of material-components/material-components-android@ac7e18efee (2026-08-14). Data as JSON: /api/errors/d67f13bb9b4b0654. Report an issue: GitHub.