material-components/material-components-android · error · IllegalArgumentException
indicatorColors cannot be empty when indicatorColor is not u
Error message
indicatorColors cannot be empty when indicatorColor is not used.
What it means
LoadingIndicatorSpec parses the indicatorColor attribute: when it points to a color everything is fine, but when it points to an array resource (@array/... via TYPE_REFERENCE) the array is read with getIntArray. An empty array resource leaves the indicator with no colors to draw, which is unrecoverable, so initialization throws IllegalArgumentException.
Source
Thrown at lib/java/com/google/android/material/loadingindicator/LoadingIndicatorSpec.java:109
};
return;
}
TypedValue indicatorColorValue =
typedArray.peekValue(R.styleable.LoadingIndicator_indicatorColor);
if (indicatorColorValue.type != TypedValue.TYPE_REFERENCE) {
indicatorColors =
new int[] {typedArray.getColor(R.styleable.LoadingIndicator_indicatorColor, -1)};
return;
}
indicatorColors =
context
.getResources()
.getIntArray(typedArray.getResourceId(R.styleable.LoadingIndicator_indicatorColor, -1));
if (indicatorColors.length == 0) {
throw new IllegalArgumentException(
"indicatorColors cannot be empty when indicatorColor is not used.");
}
}
/**
* Sets the scale specs to fit the given bound of the {@link LoadingIndicatorDrawable}.
*
* @param scaleToFit The new scaleToFit value.
*/
public void setScaleToFit(boolean scaleToFit){
this.scaleToFit = scaleToFit;
}
}
View on GitHub (pinned to ac7e18efee)
Solutions
- Populate the referenced integer-array with at least one color: <integer-array name="indicator_colors"><item>@color/blue</item></integer-array>.
- Or point app:indicatorColor at a single color instead of an array reference.
- Audit all build variants/flavors to ensure the array resource is non-empty everywhere it resolves.
Example fix
<!-- before --> <integer-array name="indicator_colors" /> <com...LoadingIndicator app:indicatorColor="@array/indicator_colors" ... /> <!-- after --> <integer-array name="indicator_colors"> <item>@color/m3_sys_color_primary</item> </integer-array>
Defensive patterns
Strategy: validation
Validate before calling
int[] colors = context.getResources().getIntArray(R.array.indicator_colors);
if (colors == null || colors.length == 0) {
colors = new int[] { ContextCompat.getColor(context, R.color.default_indicator) };
}
// then set programmatically instead of relying on the attribute Prevention
- Keep every integer-array referenced by app:indicatorColor non-empty in all flavors/build types.
- Add a CI resource check or unit test asserting array length > 0.
- Prefer a single color attribute unless multiple colors are genuinely needed.
When it happens
Trigger: Setting app:indicatorColor="@array/empty_colors" (or any <integer-array> with zero items) on a LoadingIndicator (CircularProgressIndicator-style loading spinner styled with LoadingIndicator attributes); referencing an array resource that resolves to empty in some build variant/flavor.
Common situations: Shared color arrays defined per-flavor where one flavor ships an empty list; typos pointing at the wrong array resource; arrays built by resource merging that end up empty.
Related errors
- No color resources provided for harmonization.
- Non color resource found: name={name}, typeId={typeId}
- Not supported with unknown package id: {packageId}
- No color resources found for harmonization.
- Theme overlay should be used with the accompanying int[] att
AI-assisted analysis of material-components/material-components-android@ac7e18efee (2026-08-14).
Data as JSON: /api/errors/9aa7f67c7ec3245b.
Report an issue: GitHub.