airbnb/lottie-android · error · IllegalArgumentException

lottie_rawRes and lottie_fileName cannot be used at the…

Error message

lottie_rawRes and lottie_fileName cannot be used at the same time. Please use only one at once.

What it means

Thrown during LottieAnimationView.init when the XML layout declares BOTH app:lottie_rawRes AND app:lottie_fileName at the same time. The view can only resolve its animation source from one location, so it refuses ambiguous configuration rather than guessing precedence.

Solutions

  1. Open the layout XML and delete either app:lottie_rawRes or app:lottie_fileName so exactly one source attribute remains.
  2. If you need runtime switching, remove both XML attributes and call setAnimation(rawRes) / setAnimation(fileName) from code instead.

Example fix

<!-- before -->
<com.airbnb.lottie.LottieAnimationView
    app:lottie_rawRes="@raw/loading"
    app:lottie_fileName="loading.json" />

<!-- after -->
<com.airbnb.lottie.LottieAnimationView
    app:lottie_rawRes="@raw/loading" />
Defensive patterns

Strategy: validation

Validate before calling

// Lint/regex check in CI: fail if any layout declares both source attributes
// Example shell check (run in CI):
// grep -rn 'lottie_rawRes' res/ | while read line; do ... check same element also has lottie_fileName ...

Prevention

When it happens

Trigger: A layout file containing both android attributes app:lottie_rawRes="@raw/anim" and app:lottie_fileName="anim.json" on the same <com.airbnb.lottie.LottieAnimationView> element, inflated by any LayoutInflater.

Common situations: Copy-pasting a working LottieAnimationView block and forgetting to delete the old source attribute; switching from an assets file to a raw resource (or vice versa) mid-refactor and leaving both declarations.

Related errors


AI-assisted analysis of airbnb/lottie-android@05ea92e903 (2026-08-14). Data as JSON: /api/errors/885ead7562edd6b6. Report an issue: GitHub.

Appendix: source

Thrown at lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java:165

  public LottieAnimationView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(attrs, R.attr.lottieAnimationViewStyle);
  }

  public LottieAnimationView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(attrs, defStyleAttr);
  }

  private void init(@Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
    TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.LottieAnimationView, defStyleAttr, 0);
    cacheComposition = ta.getBoolean(R.styleable.LottieAnimationView_lottie_cacheComposition, true);
    boolean hasRawRes = ta.hasValue(R.styleable.LottieAnimationView_lottie_rawRes);
    boolean hasFileName = ta.hasValue(R.styleable.LottieAnimationView_lottie_fileName);
    boolean hasUrl = ta.hasValue(R.styleable.LottieAnimationView_lottie_url);
    if (hasRawRes && hasFileName) {
      throw new IllegalArgumentException("lottie_rawRes and lottie_fileName cannot be used at " +
          "the same time. Please use only one at once.");
    } else if (hasRawRes) {
      int rawResId = ta.getResourceId(R.styleable.LottieAnimationView_lottie_rawRes, 0);
      if (rawResId != 0) {
        setAnimation(rawResId);
      }
    } else if (hasFileName) {
      String fileName = ta.getString(R.styleable.LottieAnimationView_lottie_fileName);
      if (fileName != null) {
        setAnimation(fileName);
      }
    } else if (hasUrl) {
      String url = ta.getString(R.styleable.LottieAnimationView_lottie_url);
      if (url != null) {
        setAnimationFromUrl(url);
      }
    }

View on GitHub (pinned to 05ea92e903)