From 885c50b6df08270642016c1f24a3b7e381341742 Mon Sep 17 00:00:00 2001 From: Yigit Boyar Date: Tue, 22 Mar 2016 16:53:42 -0700 Subject: [PATCH] Fix generate layout params to preserve margins This CL fixes a common bug in framework's widgets where they were not converting a child's margin layout params properly. The CL fixes, FrameLayout, RelativeLayout, GridLayout and LinearLayout. Bug: 27785449 Change-Id: Icecd9181ff82107e412174fe152f35d32d36b2e6 --- core/java/android/widget/FrameLayout.java | 10 ++++++++-- core/java/android/widget/GridLayout.java | 10 ++++++++-- core/java/android/widget/LinearLayout.java | 10 ++++++++-- core/java/android/widget/RelativeLayout.java | 10 ++++++++-- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/core/java/android/widget/FrameLayout.java b/core/java/android/widget/FrameLayout.java index 280ff151cd6d5..fe8916bf07611 100644 --- a/core/java/android/widget/FrameLayout.java +++ b/core/java/android/widget/FrameLayout.java @@ -400,8 +400,14 @@ public class FrameLayout extends ViewGroup { } @Override - protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { - return new LayoutParams(p); + protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { + if (lp instanceof LayoutParams) { + return new LayoutParams((LayoutParams) lp); + } else if (lp instanceof MarginLayoutParams) { + return new LayoutParams((MarginLayoutParams) lp); + } else { + return new LayoutParams(lp); + } } @Override diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java index ef6628a200634..726586ee8d5f3 100644 --- a/core/java/android/widget/GridLayout.java +++ b/core/java/android/widget/GridLayout.java @@ -867,8 +867,14 @@ public class GridLayout extends ViewGroup { } @Override - protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { - return new LayoutParams(p); + protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { + if (lp instanceof LayoutParams) { + return new LayoutParams((LayoutParams) lp); + } else if (lp instanceof MarginLayoutParams) { + return new LayoutParams((MarginLayoutParams) lp); + } else { + return new LayoutParams(lp); + } } // Draw grid diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java index 9e8f778f1819c..f75b74bb9a14c 100644 --- a/core/java/android/widget/LinearLayout.java +++ b/core/java/android/widget/LinearLayout.java @@ -1839,8 +1839,14 @@ public class LinearLayout extends ViewGroup { } @Override - protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { - return new LayoutParams(p); + protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { + if (lp instanceof LayoutParams) { + return new LayoutParams((LayoutParams) lp); + } else if (lp instanceof MarginLayoutParams) { + return new LayoutParams((MarginLayoutParams) lp); + } else { + return new LayoutParams(lp); + } } diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index df01fc159e60e..0136542ef4ac8 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -1103,8 +1103,14 @@ public class RelativeLayout extends ViewGroup { } @Override - protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { - return new LayoutParams(p); + protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { + if (lp instanceof LayoutParams) { + return new LayoutParams((LayoutParams) lp); + } else if (lp instanceof MarginLayoutParams) { + return new LayoutParams((MarginLayoutParams) lp); + } else { + return new LayoutParams(lp); + } } /** @hide */