Fix bug #7334966 Padding is still broken in RTL languages

- do correct resolution and reset propagation for all RTL properties (padding and drawables included)
- fix CheckedTextView padding too

Change-Id: Ie603683a2324b2a6ef2c03633d01d5726c883b90
This commit is contained in:
Fabrice Di Meglio
2012-10-11 16:27:37 -07:00
parent 4c38e24afb
commit 84ebb35f39
6 changed files with 120 additions and 34 deletions

View File

@@ -3666,15 +3666,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// Padding from the background drawable is stored at this point in mUserPaddingLeftInitial
// and mUserPaddingRightInitial) so drawable padding will be used as ultimate default if
// defined.
if (startPaddingDefined) {
mUserPaddingLeftInitial = startPadding;
} else if (leftPaddingDefined) {
if (leftPaddingDefined) {
mUserPaddingLeftInitial = leftPadding;
}
if (endPaddingDefined) {
mUserPaddingRightInitial = endPadding;
}
else if (rightPaddingDefined) {
if (rightPaddingDefined) {
mUserPaddingRightInitial = rightPadding;
}
}
@@ -11559,8 +11554,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
/**
* Resolve all RTL related properties.
*
* @hide
*/
void resolveRtlPropertiesIfNeeded() {
public void resolveRtlPropertiesIfNeeded() {
if (!needRtlPropertiesResolution()) return;
// Order is important here: LayoutDirection MUST be resolved first
@@ -11584,8 +11581,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
onRtlPropertiesChanged(getLayoutDirection());
}
// Reset resolution of all RTL related properties.
void resetRtlProperties() {
/**
* Reset resolution of all RTL related properties.
*
* @hide
*/
public void resetRtlProperties() {
resetResolvedLayoutDirection();
resetResolvedTextDirection();
resetResolvedTextAlignment();
@@ -14195,7 +14196,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @hide
*/
public void resolveDrawables() {
protected void resolveDrawables() {
if (mBackground != null) {
mBackground.setLayoutDirection(getLayoutDirection());
}
@@ -14218,7 +14219,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public void onResolveDrawables(int layoutDirection) {
}
private void resetResolvedDrawables() {
/**
* @hide
*/
protected void resetResolvedDrawables() {
mPrivateFlags2 &= ~PFLAG2_DRAWABLE_RESOLVED;
}
@@ -14804,14 +14808,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
if (isRtlCompatibilityMode()) {
mPaddingLeft = mUserPaddingLeftInitial;
mPaddingRight = mUserPaddingRightInitial;
return;
}
if (isLayoutRtl()) {
mPaddingLeft = (mUserPaddingEnd >= 0) ? mUserPaddingEnd : mUserPaddingLeftInitial;
mPaddingRight = (mUserPaddingStart >= 0) ? mUserPaddingStart : mUserPaddingRightInitial;
} else {
if (isLayoutRtl()) {
mPaddingLeft = mUserPaddingRightInitial;
mPaddingRight = mUserPaddingLeftInitial;
} else {
mPaddingLeft = mUserPaddingLeftInitial;
mPaddingRight = mUserPaddingRightInitial;
}
mPaddingLeft = (mUserPaddingStart >= 0) ? mUserPaddingStart : mUserPaddingLeftInitial;
mPaddingRight = (mUserPaddingEnd >= 0) ? mUserPaddingEnd : mUserPaddingRightInitial;
}
}

View File

@@ -5259,6 +5259,21 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
}
}
/**
* @hide
*/
@Override
public void resolveRtlPropertiesIfNeeded() {
super.resolveRtlPropertiesIfNeeded();
int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.isLayoutDirectionInherited()) {
child.resolveRtlPropertiesIfNeeded();
}
}
}
/**
* @hide
*/
@@ -5313,6 +5328,51 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
return result;
}
/**
* @hide
*/
@Override
public void resolvePadding() {
super.resolvePadding();
int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.isLayoutDirectionInherited()) {
child.resolvePadding();
}
}
}
/**
* @hide
*/
@Override
protected void resolveDrawables() {
super.resolveDrawables();
int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.isLayoutDirectionInherited()) {
child.resolveDrawables();
}
}
}
/**
* @hide
*/
@Override
public void resetRtlProperties() {
super.resetRtlProperties();
int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.isLayoutDirectionInherited()) {
child.resetRtlProperties();
}
}
}
/**
* @hide
*/
@@ -5361,6 +5421,38 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
}
}
/**
* @hide
*/
@Override
public void resetResolvedPadding() {
super.resetResolvedPadding();
int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.isLayoutDirectionInherited()) {
child.resetResolvedPadding();
}
}
}
/**
* @hide
*/
@Override
protected void resetResolvedDrawables() {
super.resetResolvedDrawables();
int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.isLayoutDirectionInherited()) {
child.resetResolvedDrawables();
}
}
}
/**
* Return true if the pressed state should be delayed for children or descendants of this
* ViewGroup. Generally, this should be done for containers that can scroll, such as a List.

View File

@@ -188,10 +188,11 @@ public class CheckedTextView extends TextView implements Checkable {
resetPaddingToInitialValues();
int newPadding = (mCheckMarkDrawable != null) ?
mCheckMarkWidth + mBasePadding : mBasePadding;
mNeedRequestlayout |= (mPaddingRight != newPadding);
if (isLayoutRtl()) {
mNeedRequestlayout |= (mPaddingLeft != newPadding);
mPaddingLeft = newPadding;
} else {
mNeedRequestlayout |= (mPaddingRight != newPadding);
mPaddingRight = newPadding;
}
if (mNeedRequestlayout) {
@@ -200,18 +201,6 @@ public class CheckedTextView extends TextView implements Checkable {
}
}
@Override
public void setPadding(int left, int top, int right, int bottom) {
super.setPadding(left, top, right, bottom);
setBasePadding(isLayoutRtl());
}
@Override
public void setPaddingRelative(int start, int top, int end, int bottom) {
super.setPaddingRelative(start, top, end, bottom);
setBasePadding(isLayoutRtl());
}
private void setBasePadding(boolean isLayoutRtl) {
if (isLayoutRtl) {
mBasePadding = mPaddingLeft;

View File

@@ -8314,6 +8314,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
}
/**
* @hide
*/
protected void resetResolvedDrawables() {
mResolvedDrawables = false;
}