diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java index f2e9988f4c0c7..7f00e506fdd0f 100644 --- a/graphics/java/android/graphics/drawable/LayerDrawable.java +++ b/graphics/java/android/graphics/drawable/LayerDrawable.java @@ -229,15 +229,18 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { } /** - * Look for a layer with the given id, and returns its {@link Drawable}. + * Looks for a layer with the given ID and returns its {@link Drawable}. + *
+ * If multiple layers are found for the given ID, returns the + * {@link Drawable} for the matching layer at the highest index. * * @param id The layer ID to search for. - * @return The {@link Drawable} of the layer that has the given id in the hierarchy or null. + * @return The {@link Drawable} for the highest-indexed layer that has the + * given ID, or null if not found. */ public Drawable findDrawableByLayerId(int id) { final ChildDrawable[] layers = mLayerState.mChildren; - final int N = mLayerState.mNum; - for (int i = 0; i < N; i++) { + for (int i = mLayerState.mNum - 1; i >= 0; i--) { if (layers[i].mId == id) { return layers[i].mDrawable; } @@ -370,7 +373,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { } /** - * Invalidates cached padding. + * Invalidates cached padding and recomputes child bounds. */ private void invalidatePadding() { mHasCachedPadding = false; @@ -379,10 +382,9 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { @Override public void invalidateDrawable(Drawable who) { - final Callback callback = getCallback(); - if (callback != null) { - callback.invalidateDrawable(this); - } + // Something changed, maybe it was the child drawable's padding. + invalidatePadding(); + invalidateSelf(); } @Override