Propagate TextView drawable state after resolving RTL drawables

Bug: 24502082
Change-Id: Iec9c44041622d19401fc074947e15b4843f79d86
This commit is contained in:
Alan Viverette
2015-12-16 16:06:23 -05:00
parent eb2094ce24
commit 189d4f5b77
2 changed files with 45 additions and 11 deletions

View File

@ -260,6 +260,12 @@ public class StateSet {
case R.attr.state_enabled:
sb.append("E ");
break;
case R.attr.state_checked:
sb.append("C ");
break;
case R.attr.state_activated:
sb.append("A ");
break;
}
}

View File

@ -393,7 +393,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
mOverride = false;
}
public void resolveWithLayoutDirection(int layoutDirection) {
/**
* Updates the list of displayed drawables to account for the current
* layout direction.
*
* @param layoutDirection the current layout direction
* @return {@code true} if the displayed drawables changed
*/
public boolean resolveWithLayoutDirection(int layoutDirection) {
final Drawable previousLeft = mShowing[Drawables.LEFT];
final Drawable previousRight = mShowing[Drawables.RIGHT];
// First reset "left" and "right" drawables to their initial values
mShowing[Drawables.LEFT] = mDrawableLeftInitial;
mShowing[Drawables.RIGHT] = mDrawableRightInitial;
@ -441,16 +451,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
break;
}
}
applyErrorDrawableIfNeeded(layoutDirection);
updateDrawablesLayoutDirection(layoutDirection);
}
private void updateDrawablesLayoutDirection(int layoutDirection) {
for (Drawable dr : mShowing) {
if (dr != null) {
dr.setLayoutDirection(layoutDirection);
}
}
applyErrorDrawableIfNeeded(layoutDirection);
return mShowing[Drawables.LEFT] != previousLeft
|| mShowing[Drawables.RIGHT] != previousRight;
}
public void setErrorDrawable(Drawable dr, TextView tv) {
@ -9809,7 +9814,30 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
// Resolve drawables
if (mDrawables != null) {
mDrawables.resolveWithLayoutDirection(layoutDirection);
if (mDrawables.resolveWithLayoutDirection(layoutDirection)) {
prepareDrawableForDisplay(mDrawables.mShowing[Drawables.LEFT]);
prepareDrawableForDisplay(mDrawables.mShowing[Drawables.RIGHT]);
applyCompoundDrawableTint();
}
}
}
/**
* Prepares a drawable for display by propagating layout direction and
* drawable state.
*
* @param dr the drawable to prepare
*/
private void prepareDrawableForDisplay(@Nullable Drawable dr) {
if (dr == null) {
return;
}
dr.setLayoutDirection(getLayoutDirection());
if (dr.isStateful()) {
dr.setState(getDrawableState());
dr.jumpToCurrentState();
}
}