Adapt ActionBar.LayoutParams to Toolbar.LayoutParams on demand

When Toolbar is acting in the role of an action bar it needs to handle
the case where app code calls setLayoutParams on a custom view with an
ActionBar.LayoutParams instance. Run the newly set LayoutParams
through the check/generate routine normally performed when adding a
child view whenever LayoutParams are set on an existing child to
correct for it.

This might not be a bad thing to generalize someday but it would make
for very confusing compatibility behavior when running code that
was written to expect it on older platform versions.

Bug 16219488

Change-Id: I568a335fe8ebbbaa666690d1f0e95f313abd2f1e
This commit is contained in:
Adam Powell
2014-07-19 11:57:21 -07:00
parent 00abaa7407
commit eb97f473fc

View File

@@ -1006,6 +1006,24 @@ public class Toolbar extends ViewGroup {
super.onRestoreInstanceState(ss.getSuperState());
}
/**
* @hide
*/
@Override
protected void onSetLayoutParams(View child, ViewGroup.LayoutParams lp) {
/*
* Apps may set ActionBar.LayoutParams on their action bar custom views when
* a Toolbar is actually acting in the role of the action bar. Perform a quick
* switch with Toolbar.LayoutParams whenever this happens. This does leave open
* one potential gotcha: if an app retains the ActionBar.LayoutParams reference
* and attempts to keep making changes to it before layout those changes won't
* be reflected in the final results.
*/
if (!checkLayoutParams(lp)) {
child.setLayoutParams(generateLayoutParams(lp));
}
}
private void measureChildConstrained(View child, int parentWidthSpec, int widthUsed,
int parentHeightSpec, int heightUsed, int heightConstraint) {
final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();