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
BaseProgressIndicatorSpec loads indicatorColor either as a single color or as an array resource (TYPE_REFERENCE). When the attribute is a reference to an array resource that is empty (zero entries), it throws IllegalArgumentException, since an indicator with no colors cannot render any stroke.
Source
Thrown at lib/java/com/google/android/material/progressindicator/BaseProgressIndicatorSpec.java:225
return;
}
TypedValue indicatorColorValue =
typedArray.peekValue(R.styleable.BaseProgressIndicator_indicatorColor);
if (indicatorColorValue.type != TypedValue.TYPE_REFERENCE) {
indicatorColors =
new int[] {typedArray.getColor(R.styleable.BaseProgressIndicator_indicatorColor, -1)};
return;
}
indicatorColors =
context
.getResources()
.getIntArray(
typedArray.getResourceId(R.styleable.BaseProgressIndicator_indicatorColor, -1));
if (indicatorColors.length == 0) {
throw new IllegalArgumentException(
"indicatorColors cannot be empty when indicatorColor is not used.");
}
}
/**
* Loads the trackColor from attributes if existing; otherwise, uses the first value in {@link
* BaseProgressIndicatorSpec#indicatorColors} applying the alpha value for disable items from
* theme. This method doesn't recycle the {@link TypedArray} argument.
*
* @param context The current active context.
* @param typedArray The TypedArray object of the attributes.
*/
private void loadTrackColor(@NonNull Context context, @NonNull TypedArray typedArray) {
if (typedArray.hasValue(R.styleable.BaseProgressIndicator_trackColor)) {
trackColor = typedArray.getColor(R.styleable.BaseProgressIndicator_trackColor, -1);
return;
}
View on GitHub (pinned to ac7e18efee)
Solutions
- Populate the color array with at least one entry
- If a single color is intended, set app:indicatorColor="@color/x" directly instead of an array reference
- Add a resource-level sanity check for generated color arrays (fail build when empty)
Example fix
<!-- before: res/values/arrays.xml --> <integer-array name="progress_colors"/> <!-- after --> <integer-array name="progress_colors"> <item>@color/brand_primary</item> <item>@color/brand_secondary</item> </integer-array>
Defensive patterns
Strategy: validation
Validate before calling
fun hasNonEmptyColorArray(context: Context, arrayRes: Int): Boolean {
val arr = context.resources.getIntArray(arrayRes)
return arr.isNotEmpty()
} Try / catch
catch (e: IllegalArgumentException) { Log.e(TAG, "indicatorColor array empty; using single color", e); setSingleIndicatorColor() } Prevention
- Ensure every color array resource has at least one entry
- Prefer a single @color when only one color is needed
- Assert generated arrays are non-empty in build checks
When it happens
Trigger: Setting app:indicatorColor="@array/empty_colors" (an <integer-array> or similar with no <item> entries) on LinearProgressIndicator/CircularProgressIndicator; the TypedValue is TYPE_REFERENCE, getIntArray returns length 0, and the guard throws.
Common situations: Colors array generated from a build config or remote config that ends up empty; placeholder array resource left empty; wrong resource linked (points at an empty array).
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.
- Cannot set framework drawable as progress drawable.
AI-assisted analysis of material-components/material-components-android@ac7e18efee (2026-08-14).
Data as JSON: /api/errors/83b4c138a99f5443.
Report an issue: GitHub.