material-components/material-components-android · error · IllegalArgumentException
Invalid slide direction: > slideEdge <
Error message
Invalid slide direction: > slideEdge <
What it means
When a SlideDistanceProvider appear-animation starts, createTranslationAppearAnimator switches on the configured slideEdge and supports only Gravity.LEFT, TOP, RIGHT, BOTTOM, START and END. Any other gravity flag (single unsupported values like Gravity.CENTER, or composite/bitmask flags such as Gravity.CENTER_VERTICAL, Gravity.FILL, TOP|START) misses every case and hits the default branch, throwing IllegalArgumentException('Invalid slide direction: ' + slideEdge).
Source
Thrown at lib/java/com/google/android/material/transition/platform/SlideDistanceProvider.java:157
return createTranslationYAnimator(view, originalY - slideDistance, originalY, originalY);
case Gravity.RIGHT:
return createTranslationXAnimator(view, originalX - slideDistance, originalX, originalX);
case Gravity.BOTTOM:
return createTranslationYAnimator(view, originalY + slideDistance, originalY, originalY);
case Gravity.START:
return createTranslationXAnimator(
view,
isRtl(sceneRoot) ? originalX + slideDistance : originalX - slideDistance,
originalX,
originalX);
case Gravity.END:
return createTranslationXAnimator(
view,
isRtl(sceneRoot) ? originalX - slideDistance : originalX + slideDistance,
originalX,
originalX);
default:
throw new IllegalArgumentException("Invalid slide direction: " + slideEdge);
}
}
private static Animator createTranslationDisappearAnimator(
View sceneRoot, View view, @GravityFlag int slideEdge, @Px int slideDistance) {
final float originalX = view.getTranslationX();
final float originalY = view.getTranslationY();
switch (slideEdge) {
case Gravity.LEFT:
return createTranslationXAnimator(view, originalX, originalX - slideDistance, originalX);
case Gravity.TOP:
return createTranslationYAnimator(view, originalY, originalY + slideDistance, originalY);
case Gravity.RIGHT:
return createTranslationXAnimator(view, originalX, originalX + slideDistance, originalX);
case Gravity.BOTTOM:
return createTranslationYAnimator(view, originalY, originalY - slideDistance, originalY);
case Gravity.START:
return createTranslationXAnimator(View on GitHub (pinned to ac7e18efee)
Solutions
- Pass one of the six supported edge constants: Gravity.LEFT, Gravity.TOP, Gravity.RIGHT, Gravity.BOTTOM, Gravity.START or Gravity.END.
- If the value comes from config, validate it against a whitelist before calling setSlideEdge (see validationCode).
- Normalize composite gravities first with Gravity.absoluteGravityValue / by extracting a single edge, instead of forwarding the raw flag.
- Prefer START/END over LEFT/RIGHT so RTL layouts slide correctly.
Example fix
// before provider.setSlideEdge(Gravity.CENTER); // throws on createAppear // after provider.setSlideEdge(Gravity.END);
Defensive patterns
Strategy: type-guard
Validate before calling
static final Set<Integer> SUPPORTED_EDGES = new HashSet<>(Arrays.asList(
Gravity.LEFT, Gravity.TOP, Gravity.RIGHT, Gravity.BOTTOM,
Gravity.START, Gravity.END));
int normalizeSlideEdge(int edge) {
return SUPPORTED_EDGES.contains(edge) ? edge : Gravity.END; // sane default
} Type guard
static boolean isSupportedSlideEdge(@GravityFlag int edge) {
return edge == Gravity.LEFT || edge == Gravity.TOP || edge == Gravity.RIGHT
|| edge == Gravity.BOTTOM || edge == Gravity.START || edge == Gravity.END;
} Prevention
- Never forward a composite android:gravity bitmask into setSlideEdge — pick a single edge.
- Whitelist edges from configs/prefs with isSupportedSlideEdge before applying.
- Note Gravity.CENTER and Gravity.NO_GRAVITY are NOT slide edges.
- Test the enter animation after any edge change; the throw happens at animator creation.
When it happens
Trigger: Calling setSlideEdge(Gravity.CENTER), Gravity.NO_GRAVITY (0), Gravity.FILL, or a combined bitmask like Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL on a SlideDistanceProvider/MaterialSharedAxis-style provider; reusing a gravity constant parsed from XML (android:gravity values) without narrowing it to an edge.
Common situations: Copy-pasting a layout's android:gravity (e.g., center) into setSlideEdge; storing the slide edge in preferences as a generic gravity int; refactoring from a side-drawer gravity that uses composite flags; Gravity.NO_GRAVITY leaking through when a binding is unset.
Related errors
- Invalid slide direction: > slideEdge <
- Invalid axis: > axis <
- Slide distance must be positive. If attempting to reverse th
- There must be a keyline marked as focal.
- No color resources provided for harmonization.
AI-assisted analysis of material-components/material-components-android@ac7e18efee (2026-08-14).
Data as JSON: /api/errors/f9afc87538123f94.
Report an issue: GitHub.