diff --git a/api/current.txt b/api/current.txt index a39bc79a46eeb..b6f5d6435c100 100644 --- a/api/current.txt +++ b/api/current.txt @@ -3212,7 +3212,6 @@ package android.app { ctor public ActionBar.LayoutParams(int); ctor public ActionBar.LayoutParams(android.app.ActionBar.LayoutParams); ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams); - ctor public ActionBar.LayoutParams(android.view.ViewGroup.MarginLayoutParams); field public int gravity; } diff --git a/core/java/android/app/ActionBar.java b/core/java/android/app/ActionBar.java index 628875f0218e2..5c981802b0dc4 100644 --- a/core/java/android/app/ActionBar.java +++ b/core/java/android/app/ActionBar.java @@ -1334,8 +1334,14 @@ public abstract class ActionBar { super(source); } - public LayoutParams(MarginLayoutParams source) { - super(source); - } + /* + * Note for framework developers: + * + * You might notice that ActionBar.LayoutParams is missing a constructor overload + * for MarginLayoutParams. While it may seem like a good idea to add one, at this + * point it's dangerous for source compatibility. Upon building against a new + * version of the SDK an app can end up statically linking to the new MarginLayoutParams + * overload, causing a crash when running on older platform versions with no other changes. + */ } } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 28e8bd63191d3..36e5996e5183c 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -6475,6 +6475,20 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager mMarginFlags &= ~RTL_COMPATIBILITY_MODE_MASK; } + /** + * @hide Used internally. + */ + public final void copyMarginsFrom(MarginLayoutParams source) { + this.leftMargin = source.leftMargin; + this.topMargin = source.topMargin; + this.rightMargin = source.rightMargin; + this.bottomMargin = source.bottomMargin; + this.startMargin = source.startMargin; + this.endMargin = source.endMargin; + + this.mMarginFlags = source.mMarginFlags; + } + /** * Sets the margins, in pixels. A call to {@link android.view.View#requestLayout()} needs * to be done so that the new margins are taken into account. Left and right margins may be diff --git a/core/java/android/widget/Toolbar.java b/core/java/android/widget/Toolbar.java index 122df2cdd4977..d140c82b38652 100644 --- a/core/java/android/widget/Toolbar.java +++ b/core/java/android/widget/Toolbar.java @@ -1585,6 +1585,10 @@ public class Toolbar extends ViewGroup { /** * Layout information for child views of Toolbars. * + *

Toolbar.LayoutParams extends ActionBar.LayoutParams for compatibility with existing + * ActionBar API. See {@link android.app.Activity#setActionBar(Toolbar) Activity.setActionBar} + * for more info on how to use a Toolbar as your Activity's ActionBar.

+ * * @attr ref android.R.styleable#Toolbar_LayoutParams_layout_gravity */ public static class LayoutParams extends ActionBar.LayoutParams { @@ -1624,6 +1628,9 @@ public class Toolbar extends ViewGroup { public LayoutParams(MarginLayoutParams source) { super(source); + // ActionBar.LayoutParams doesn't have a MarginLayoutParams constructor. + // Fake it here and copy over the relevant data. + copyMarginsFrom(source); } public LayoutParams(ViewGroup.LayoutParams source) {