diff --git a/widgets/src/main/java/org/nativescript/widgets/AbsoluteLayout.java b/widgets/src/main/java/org/nativescript/widgets/AbsoluteLayout.java index aaee2f6a8..21ebd1fd8 100644 --- a/widgets/src/main/java/org/nativescript/widgets/AbsoluteLayout.java +++ b/widgets/src/main/java/org/nativescript/widgets/AbsoluteLayout.java @@ -18,7 +18,8 @@ public class AbsoluteLayout extends LayoutBase { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - + CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec); + int measureWidth = 0; int measureHeight = 0; int childMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); @@ -29,8 +30,7 @@ public class AbsoluteLayout extends LayoutBase { if (child.getVisibility() == View.GONE) { continue; } - - CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec); + CommonLayoutParams.measureChild(child, childMeasureSpec, childMeasureSpec); final int childMeasuredWidth = CommonLayoutParams.getDesiredWidth(child); final int childMeasuredHeight = CommonLayoutParams.getDesiredHeight(child); @@ -56,7 +56,6 @@ public class AbsoluteLayout extends LayoutBase { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - int leftPadding = this.getPaddingLeft(); int topPadding = this.getPaddingTop(); int count = this.getChildCount(); @@ -78,5 +77,7 @@ public class AbsoluteLayout extends LayoutBase { CommonLayoutParams.layoutChild(child, childLeft, childTop, childRight, childBottom); } + + CommonLayoutParams.restoreOriginalParams(this); } } diff --git a/widgets/src/main/java/org/nativescript/widgets/CommonLayoutParams.java b/widgets/src/main/java/org/nativescript/widgets/CommonLayoutParams.java index 6e99a6e2c..d35faf6d0 100644 --- a/widgets/src/main/java/org/nativescript/widgets/CommonLayoutParams.java +++ b/widgets/src/main/java/org/nativescript/widgets/CommonLayoutParams.java @@ -1,5 +1,5 @@ /** - * + * */ package org.nativescript.widgets; @@ -11,52 +11,60 @@ import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.View.MeasureSpec; +import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.FrameLayout; /** * @author hhristov - * */ public class CommonLayoutParams extends FrameLayout.LayoutParams { - static final String TAG = "NSLayout"; - static int debuggable = -1; - private static final StringBuilder sb = new StringBuilder(); - - public CommonLayoutParams() { - super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); - } + static final String TAG = "NSLayout"; + static int debuggable = -1; + private static final StringBuilder sb = new StringBuilder(); - public float widthPercent = 0; - public float heightPercent = 0; - - public float topMarginPercent = 0; - public float leftMarginPercent = 0; - public float bottomMarginPercent = 0; - public float rightMarginPercent = 0; - - public int left = 0; - public int top = 0; - public int row = 0; - public int column = 0; - public int rowSpan = 1; - public int columnSpan = 1; - public Dock dock = Dock.left; - - public static int getDesiredWidth(View view) { - CommonLayoutParams lp = (CommonLayoutParams)view.getLayoutParams(); + public CommonLayoutParams() { + super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + } + + public float widthPercent = 0; + public float heightPercent = 0; + + public float topMarginPercent = 0; + public float leftMarginPercent = 0; + public float bottomMarginPercent = 0; + public float rightMarginPercent = 0; + + public int widthOriginal = -1; + public int heightOriginal = -1; + + public int topMarginOriginal = -1; + public int leftMarginOriginal = -1; + public int bottomMarginOriginal = -1; + public int rightMarginOriginal = -1; + + public int left = 0; + public int top = 0; + public int row = 0; + public int column = 0; + public int rowSpan = 1; + public int columnSpan = 1; + public Dock dock = Dock.left; + + protected static int getDesiredWidth(View view) { + CommonLayoutParams lp = (CommonLayoutParams) view.getLayoutParams(); return view.getMeasuredWidth() + lp.leftMargin + lp.rightMargin; } - - public static int getDesiredHeight(View view) { - CommonLayoutParams lp = (CommonLayoutParams)view.getLayoutParams(); - return view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; + + protected static int getDesiredHeight(View view) { + CommonLayoutParams lp = (CommonLayoutParams) view.getLayoutParams(); + return view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; } // We use our own layout method because the one in FrameLayout is broken when margins are set and gravity is CENTER_VERTICAL or CENTER_HORIZONTAL. @SuppressLint("RtlHardcoded") - public static void layoutChild(View child, int left, int top, int right, int bottom) { + protected static void layoutChild(View child, int left, int top, int right, int bottom) { if (child.getVisibility() == View.GONE) { return; } @@ -67,216 +75,287 @@ public class CommonLayoutParams extends FrameLayout.LayoutParams { int childWidth = child.getMeasuredWidth(); int childHeight = child.getMeasuredHeight(); - CommonLayoutParams lp = (CommonLayoutParams)child.getLayoutParams(); + CommonLayoutParams lp = (CommonLayoutParams) child.getLayoutParams(); int gravity = lp.gravity; if (gravity == -1) { gravity = Gravity.FILL; - } - + } + int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; - + // If we have explicit height and gravity is FILL we need to be centered otherwise our explicit height won't be taken into account. if (lp.height >= 0 && verticalGravity == Gravity.FILL_VERTICAL) { - verticalGravity = Gravity.CENTER_VERTICAL; + verticalGravity = Gravity.CENTER_VERTICAL; } - + switch (verticalGravity) { - case Gravity.TOP: - childTop = top + lp.topMargin; - break; - - case Gravity.CENTER_VERTICAL: - childTop = top + (bottom - top - childHeight + lp.topMargin - lp.bottomMargin) / 2; - break; - - case Gravity.BOTTOM: - childTop = bottom - childHeight - lp.bottomMargin; - break; - - case Gravity.FILL_VERTICAL: - default: - childTop = top + lp.topMargin; - childHeight = bottom - top - (lp.topMargin + lp.bottomMargin); - break; + case Gravity.TOP: + childTop = top + lp.topMargin; + break; + + case Gravity.CENTER_VERTICAL: + childTop = top + (bottom - top - childHeight + lp.topMargin - lp.bottomMargin) / 2; + break; + + case Gravity.BOTTOM: + childTop = bottom - childHeight - lp.bottomMargin; + break; + + case Gravity.FILL_VERTICAL: + default: + childTop = top + lp.topMargin; + childHeight = bottom - top - (lp.topMargin + lp.bottomMargin); + break; } int horizontalGravity = Gravity.getAbsoluteGravity(gravity, child.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK; - + // If we have explicit width and gravity is FILL we need to be centered otherwise our explicit width won't be taken into account. if (lp.width >= 0 && horizontalGravity == Gravity.FILL_HORIZONTAL) { - horizontalGravity = Gravity.CENTER_HORIZONTAL; + horizontalGravity = Gravity.CENTER_HORIZONTAL; } switch (horizontalGravity) { - case Gravity.LEFT: - childLeft = left + lp.leftMargin; - break; - - case Gravity.CENTER_HORIZONTAL: - childLeft = left + (right - left - childWidth + lp.leftMargin - lp.rightMargin) / 2; - break; - - case Gravity.RIGHT: - childLeft = right - childWidth - lp.rightMargin; - break; - - case Gravity.FILL_HORIZONTAL: - default: - childLeft = left + lp.leftMargin; - childWidth = right - left - (lp.leftMargin + lp.rightMargin); - break; - } + case Gravity.LEFT: + childLeft = left + lp.leftMargin; + break; + + case Gravity.CENTER_HORIZONTAL: + childLeft = left + (right - left - childWidth + lp.leftMargin - lp.rightMargin) / 2; + break; + + case Gravity.RIGHT: + childLeft = right - childWidth - lp.rightMargin; + break; + + case Gravity.FILL_HORIZONTAL: + default: + childLeft = left + lp.leftMargin; + childWidth = right - left - (lp.leftMargin + lp.rightMargin); + break; + } int childRight = Math.round(childLeft + childWidth); int childBottom = Math.round(childTop + childHeight); childLeft = Math.round(childLeft); childTop = Math.round(childTop); - + // Re-measure TextView because it is not centered if layout width is larger than measure width. if (child instanceof android.widget.TextView) { - boolean canChangeWidth = lp.width < 0; - boolean canChangeHeight = lp.height < 0; - - int measuredWidth = child.getMeasuredWidth(); - int measuredHeight = child.getMeasuredHeight(); - - int width = childRight - childLeft; - int height = childBottom - childTop; - if ((Math.abs(measuredWidth - width) > 1 && canChangeWidth) || (Math.abs(measuredHeight - height) > 1 && canChangeHeight)) { - int widthMeasureSpec = MeasureSpec.makeMeasureSpec(canChangeWidth ? width : lp.width, MeasureSpec.EXACTLY); - int heightMeasureSpec = MeasureSpec.makeMeasureSpec(canChangeHeight ? height : lp.height, MeasureSpec.EXACTLY); - if (debuggable > 0) { - sb.setLength(0); - sb.append("remeasure "); - sb.append(child); - sb.append(" with "); - sb.append(MeasureSpec.toString(widthMeasureSpec)); - sb.append(", "); - sb.append(MeasureSpec.toString(heightMeasureSpec)); - log(TAG, sb.toString()); - } - - child.measure(widthMeasureSpec, heightMeasureSpec); - } + boolean canChangeWidth = lp.width < 0; + boolean canChangeHeight = lp.height < 0; + + int measuredWidth = child.getMeasuredWidth(); + int measuredHeight = child.getMeasuredHeight(); + + int width = childRight - childLeft; + int height = childBottom - childTop; + if ((Math.abs(measuredWidth - width) > 1 && canChangeWidth) || (Math.abs(measuredHeight - height) > 1 && canChangeHeight)) { + int widthMeasureSpec = MeasureSpec.makeMeasureSpec(canChangeWidth ? width : lp.width, MeasureSpec.EXACTLY); + int heightMeasureSpec = MeasureSpec.makeMeasureSpec(canChangeHeight ? height : lp.height, MeasureSpec.EXACTLY); + if (debuggable > 0) { + sb.setLength(0); + sb.append("remeasure "); + sb.append(child); + sb.append(" with "); + sb.append(MeasureSpec.toString(widthMeasureSpec)); + sb.append(", "); + sb.append(MeasureSpec.toString(heightMeasureSpec)); + log(TAG, sb.toString()); + } + + child.measure(widthMeasureSpec, heightMeasureSpec); + } } - + if (debuggable > 0) { - sb.setLength(0); - sb.append(child.getParent().toString()); - sb.append(" :layoutChild: "); - sb.append(child.toString()); - sb.append(" "); - sb.append(childLeft); - sb.append(", "); - sb.append(childTop); - sb.append(", "); - sb.append(childRight); - sb.append(", "); - sb.append(childBottom); - log(TAG, sb.toString()); + sb.setLength(0); + sb.append(child.getParent().toString()); + sb.append(" :layoutChild: "); + sb.append(child.toString()); + sb.append(" "); + sb.append(childLeft); + sb.append(", "); + sb.append(childTop); + sb.append(", "); + sb.append(childRight); + sb.append(", "); + sb.append(childBottom); + log(TAG, sb.toString()); } - + child.layout(childLeft, childTop, childRight, childBottom); } - - public static void measureChild(View child, int widthMeasureSpec, int heightMeasureSpec) { + + protected static void measureChild(View child, int widthMeasureSpec, int heightMeasureSpec) { if (child.getVisibility() == View.GONE) { return; } // Negative means not initialized. - if(debuggable < 0) { - try { - Context context = child.getContext(); - ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), android.content.pm.PackageManager.GET_META_DATA); - android.os.Bundle bundle = ai.metaData; - Boolean debugLayouts = bundle != null ? bundle.getBoolean("debugLayouts", false) : false; - debuggable = debugLayouts ? 1 : 0; - } catch (NameNotFoundException e) { - debuggable = 0; - Log.e(TAG, "Failed to load meta-data, NameNotFound: " + e.getMessage()); - } catch (NullPointerException e) { - debuggable = 0; - Log.e(TAG, "Failed to load meta-data, NullPointer: " + e.getMessage()); - } + if (debuggable < 0) { + try { + Context context = child.getContext(); + ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), android.content.pm.PackageManager.GET_META_DATA); + android.os.Bundle bundle = ai.metaData; + Boolean debugLayouts = bundle != null ? bundle.getBoolean("debugLayouts", false) : false; + debuggable = debugLayouts ? 1 : 0; + } catch (NameNotFoundException e) { + debuggable = 0; + Log.e(TAG, "Failed to load meta-data, NameNotFound: " + e.getMessage()); + } catch (NullPointerException e) { + debuggable = 0; + Log.e(TAG, "Failed to load meta-data, NullPointer: " + e.getMessage()); + } } - + int childWidthMeasureSpec = getMeasureSpec(child, widthMeasureSpec, true); int childHeightMeasureSpec = getMeasureSpec(child, heightMeasureSpec, false); if (debuggable > 0) { - sb.setLength(0); - sb.append(child.getParent().toString()); - sb.append(" :measureChild: "); - sb.append(child.toString()); - sb.append(" "); - sb.append(MeasureSpec.toString(childWidthMeasureSpec)); - sb.append(", "); - sb.append(MeasureSpec.toString(childHeightMeasureSpec)); - log(TAG, sb.toString()); + sb.setLength(0); + sb.append(child.getParent().toString()); + sb.append(" :measureChild: "); + sb.append(child.toString()); + sb.append(" "); + sb.append(MeasureSpec.toString(childWidthMeasureSpec)); + sb.append(", "); + sb.append(MeasureSpec.toString(childHeightMeasureSpec)); + log(TAG, sb.toString()); } - + child.measure(childWidthMeasureSpec, childHeightMeasureSpec); } - public static void updateChildLayoutParams(View child, int widthMeasureSpec, int heightMeasureSpec) { - - int availableWidth = MeasureSpec.getSize(widthMeasureSpec); - int widthSpec = MeasureSpec.getMode(widthMeasureSpec); - - int availableHeight = MeasureSpec.getSize(heightMeasureSpec); - int heightSpec = MeasureSpec.getMode(heightMeasureSpec); - - CommonLayoutParams lp = (CommonLayoutParams)child.getLayoutParams(); - if (widthSpec != MeasureSpec.UNSPECIFIED) { - if (lp.widthPercent > 0) { - lp.width = (int)(availableWidth * lp.widthPercent); - } - - if (lp.leftMarginPercent > 0) { - lp.leftMargin = (int)(availableWidth * lp.leftMarginPercent); - } - - if (lp.rightMarginPercent > 0) { - lp.rightMargin = (int)(availableWidth * lp.rightMarginPercent); - } - } - - if (heightSpec != MeasureSpec.UNSPECIFIED) { - if (lp.heightPercent > 0) { - lp.height = (int)(availableHeight * lp.heightPercent); - } - - if (lp.topMarginPercent > 0) { - lp.topMargin = (int)(availableHeight * lp.topMarginPercent); - } - - if (lp.bottomMarginPercent > 0) { - lp.bottomMargin = (int)(availableHeight * lp.bottomMarginPercent); - } - } + /** + * Iterates over children and changes their width and height to one calculated from percentage + * values. + * + * @param viewGroup The parent ViewGroup. + * @param widthMeasureSpec Width MeasureSpec of the parent ViewGroup. + * @param heightMeasureSpec Height MeasureSpec of the parent ViewGroup. + */ + protected static void adjustChildrenLayoutParams(ViewGroup viewGroup, int widthMeasureSpec, int heightMeasureSpec) { + + int availableWidth = MeasureSpec.getSize(widthMeasureSpec); + int widthSpec = MeasureSpec.getMode(widthMeasureSpec); + + int availableHeight = MeasureSpec.getSize(heightMeasureSpec); + int heightSpec = MeasureSpec.getMode(heightMeasureSpec); + + for (int i = 0, count = viewGroup.getChildCount(); i < count; i++) { + View child = viewGroup.getChildAt(i); + ViewGroup.LayoutParams params = child.getLayoutParams(); + + if (params instanceof CommonLayoutParams) { + CommonLayoutParams lp = (CommonLayoutParams) child.getLayoutParams(); + if (widthSpec != MeasureSpec.UNSPECIFIED) { + if (lp.widthPercent > 0) { + lp.widthOriginal = lp.width; + lp.width = (int) (availableWidth * lp.widthPercent); + } + else { + lp.widthOriginal = -1; + } + + if (lp.leftMarginPercent > 0) { + lp.leftMarginOriginal = lp.leftMargin; + lp.leftMargin = (int) (availableWidth * lp.leftMarginPercent); + } + else { + lp.leftMarginOriginal = -1; + } + + if (lp.rightMarginPercent > 0) { + lp.rightMarginOriginal = lp.rightMargin; + lp.rightMargin = (int) (availableWidth * lp.rightMarginPercent); + } + else { + lp.rightMarginOriginal = -1; + } + } + + if (heightSpec != MeasureSpec.UNSPECIFIED) { + if (lp.heightPercent > 0) { + lp.heightOriginal = lp.height; + lp.height = (int) (availableHeight * lp.heightPercent); + } + else { + lp.heightOriginal = -1; + } + + if (lp.topMarginPercent > 0) { + lp.topMarginOriginal = lp.topMargin; + lp.topMargin = (int) (availableHeight * lp.topMarginPercent); + } + else { + lp.topMarginOriginal = -1; + } + + if (lp.bottomMarginPercent > 0) { + lp.bottomMarginOriginal = lp.bottomMargin; + lp.bottomMargin = (int) (availableHeight * lp.bottomMarginPercent); + } + else { + lp.bottomMarginOriginal = -1; + } + } + } + } } - static void log(String tag, String message) { + /** + * Iterates over children and restores their original dimensions that were changed for + * percentage values. + */ + protected static void restoreOriginalParams(ViewGroup viewGroup) { + for (int i = 0, count = viewGroup.getChildCount(); i < count; i++) { + View view = viewGroup.getChildAt(i); + ViewGroup.LayoutParams params = view.getLayoutParams(); + if (params instanceof CommonLayoutParams) { + CommonLayoutParams lp = (CommonLayoutParams) params; + if (lp.widthPercent > 0) { + lp.width = lp.widthOriginal; + } + if (lp.heightPercent > 0) { + lp.height = lp.heightOriginal; + } + if (lp.leftMarginPercent > 0) { + lp.leftMargin = lp.leftMarginOriginal; + } + if (lp.topMarginPercent > 0) { + lp.topMargin = lp.topMarginOriginal; + } + if (lp.rightMarginPercent > 0) { + lp.rightMargin = lp.rightMarginOriginal; + } + if (lp.bottomMarginPercent > 0) { + lp.bottomMargin = lp.bottomMarginOriginal; + } + } + } + } + + static void log(String tag, String message) { Log.d(tag, message); } - - static StringBuilder getStringBuilder() { - sb.setLength(0); - return sb; - } - + + static StringBuilder getStringBuilder() { + sb.setLength(0); + return sb; + } + private static int getMeasureSpec(View view, int parentMeasureSpec, boolean horizontal) { - int parentLength = MeasureSpec.getSize(parentMeasureSpec); - int parentSpecMode = MeasureSpec.getMode(parentMeasureSpec); - - CommonLayoutParams lp = (CommonLayoutParams)view.getLayoutParams(); + int parentLength = MeasureSpec.getSize(parentMeasureSpec); + int parentSpecMode = MeasureSpec.getMode(parentMeasureSpec); + + CommonLayoutParams lp = (CommonLayoutParams) view.getLayoutParams(); final int margins = horizontal ? lp.leftMargin + lp.rightMargin : lp.topMargin + lp.bottomMargin; int resultSize = 0; - int resultMode = 0; + int resultMode = MeasureSpec.UNSPECIFIED; int measureLength = Math.max(0, parentLength - margins); int childLength = horizontal ? lp.width : lp.height; @@ -285,27 +364,24 @@ public class CommonLayoutParams extends FrameLayout.LayoutParams { if (childLength >= 0) { if (parentSpecMode != MeasureSpec.UNSPECIFIED) { resultSize = Math.min(parentLength, childLength); - } - else { + } else { resultSize = childLength; } resultMode = MeasureSpec.EXACTLY; - } - else { + } else { switch (parentSpecMode) { // Parent has imposed an exact size on us case MeasureSpec.EXACTLY: resultSize = measureLength; int gravity = LayoutBase.getGravity(view); boolean stretched; - if (horizontal) { - final int horizontalGravity = Gravity.getAbsoluteGravity(gravity, view.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK; - stretched = horizontalGravity == Gravity.FILL_HORIZONTAL; - } - else { - final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; - stretched = verticalGravity == Gravity.FILL_VERTICAL; + if (horizontal) { + final int horizontalGravity = Gravity.getAbsoluteGravity(gravity, view.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK; + stretched = horizontalGravity == Gravity.FILL_HORIZONTAL; + } else { + final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; + stretched = verticalGravity == Gravity.FILL_VERTICAL; } // if stretched - view wants to be our size. So be it. @@ -328,4 +404,4 @@ public class CommonLayoutParams extends FrameLayout.LayoutParams { return MeasureSpec.makeMeasureSpec(resultSize, resultMode); } -} +} \ No newline at end of file diff --git a/widgets/src/main/java/org/nativescript/widgets/ContentLayout.java b/widgets/src/main/java/org/nativescript/widgets/ContentLayout.java index e2459027a..283436dda 100644 --- a/widgets/src/main/java/org/nativescript/widgets/ContentLayout.java +++ b/widgets/src/main/java/org/nativescript/widgets/ContentLayout.java @@ -18,7 +18,8 @@ public class ContentLayout extends LayoutBase { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - + CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec); + int measureWidth = 0; int measureHeight = 0; @@ -29,7 +30,6 @@ public class ContentLayout extends LayoutBase { continue; } - CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec); CommonLayoutParams.measureChild(child, widthMeasureSpec, heightMeasureSpec); final int childMeasuredWidth = CommonLayoutParams.getDesiredWidth(child); final int childMeasuredHeight = CommonLayoutParams.getDesiredHeight(child); @@ -54,7 +54,6 @@ public class ContentLayout extends LayoutBase { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - int paddingLeft = this.getPaddingLeft(); int paddingRight = this.getPaddingRight(); int paddingTop = this.getPaddingTop(); @@ -75,5 +74,7 @@ public class ContentLayout extends LayoutBase { CommonLayoutParams.layoutChild(child, childLeft, childTop, childRight, childBottom); } + + CommonLayoutParams.restoreOriginalParams(this); } } diff --git a/widgets/src/main/java/org/nativescript/widgets/DockLayout.java b/widgets/src/main/java/org/nativescript/widgets/DockLayout.java index 405b57cc3..cee18e54a 100644 --- a/widgets/src/main/java/org/nativescript/widgets/DockLayout.java +++ b/widgets/src/main/java/org/nativescript/widgets/DockLayout.java @@ -27,6 +27,7 @@ public class DockLayout extends LayoutBase { } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec); int measureWidth = 0; int measureHeight = 0; @@ -64,7 +65,6 @@ public class DockLayout extends LayoutBase { childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(remainingHeight, heightMode == MeasureSpec.EXACTLY ? MeasureSpec.AT_MOST : heightMode); } - CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec); CommonLayoutParams.measureChild(child, childWidthMeasureSpec, childHeightMeasureSpec); final int childMeasuredWidth = CommonLayoutParams.getDesiredWidth(child); final int childMeasuredHeight = CommonLayoutParams.getDesiredHeight(child); @@ -107,7 +107,6 @@ public class DockLayout extends LayoutBase { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - int childLeft = this.getPaddingLeft(); int childTop = this.getPaddingTop(); @@ -173,5 +172,7 @@ public class DockLayout extends LayoutBase { if (childToStretch != null) { CommonLayoutParams.layoutChild(childToStretch, x, y, x + remainingWidth, y + remainingHeight); } + + CommonLayoutParams.restoreOriginalParams(this); } } diff --git a/widgets/src/main/java/org/nativescript/widgets/GridLayout.java b/widgets/src/main/java/org/nativescript/widgets/GridLayout.java index 0aa608967..fb6cca819 100644 --- a/widgets/src/main/java/org/nativescript/widgets/GridLayout.java +++ b/widgets/src/main/java/org/nativescript/widgets/GridLayout.java @@ -232,8 +232,9 @@ public class GridLayout extends LayoutBase { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec); - int measureWidth = 0; + int measureWidth = 0; int measureHeight = 0; int width = View.MeasureSpec.getSize(widthMeasureSpec); @@ -251,7 +252,7 @@ public class GridLayout extends LayoutBase { this.helper.width = width - horizontalPadding; this.helper.height = height - verticalPadding; - int gravity = getGravity(this); + int gravity = LayoutBase.getGravity(this); int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; final int layoutDirection = this.getLayoutDirection(); final int horizontalGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection) & Gravity.HORIZONTAL_GRAVITY_MASK; @@ -272,7 +273,6 @@ public class GridLayout extends LayoutBase { continue; } - CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec); MeasureSpecs measureSpecs = this.map.get(child); this.updateMeasureSpecs(child, measureSpecs); this.helper.addMeasureSpec(measureSpecs); @@ -296,7 +296,6 @@ public class GridLayout extends LayoutBase { @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { - int paddingLeft = this.getPaddingLeft(); int paddingTop = this.getPaddingTop(); @@ -356,6 +355,8 @@ public class GridLayout extends LayoutBase { CommonLayoutParams.layoutChild(measureSpec.child, childLeft, childTop, childRight, childBottom); } } + + CommonLayoutParams.restoreOriginalParams(this); } } diff --git a/widgets/src/main/java/org/nativescript/widgets/HorizontalScrollView.java b/widgets/src/main/java/org/nativescript/widgets/HorizontalScrollView.java index 18f597446..d09441f6c 100644 --- a/widgets/src/main/java/org/nativescript/widgets/HorizontalScrollView.java +++ b/widgets/src/main/java/org/nativescript/widgets/HorizontalScrollView.java @@ -65,7 +65,9 @@ public class HorizontalScrollView extends android.widget.HorizontalScrollView { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // Don't call measure because it will measure content twice. + CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec); + + // Don't call measure because it will measure content twice. // ScrollView is expected to have single child so we measure only the first child. View child = this.getChildCount() > 0 ? this.getChildAt(0) : null; if (child == null) { @@ -74,7 +76,6 @@ public class HorizontalScrollView extends android.widget.HorizontalScrollView { this.contentMeasuredHeight = 0; } else { - CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec); CommonLayoutParams.measureChild(child, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), heightMeasureSpec); this.contentMeasuredWidth = CommonLayoutParams.getDesiredWidth(child); this.contentMeasuredHeight = CommonLayoutParams.getDesiredHeight(child); @@ -86,8 +87,8 @@ public class HorizontalScrollView extends android.widget.HorizontalScrollView { // Don't add in our paddings because they are already added as child margins. (we will include them twice if we add them). // Check the previous line - this.setPadding(lp.leftMargin, lp.topMargin, lp.rightMargin, lp.bottomMargin); -// this.contentMeasuredWidth += this.getPaddingLeft() + this.getPaddingRight(); -// this.contentMeasuredHeight += this.getPaddingTop() + this.getPaddingBottom(); + //this.contentMeasuredWidth += this.getPaddingLeft() + this.getPaddingRight(); + //this.contentMeasuredHeight += this.getPaddingTop() + this.getPaddingBottom(); // Check against our minimum height this.contentMeasuredWidth = Math.max(this.contentMeasuredWidth, this.getSuggestedMinimumWidth()); @@ -147,6 +148,7 @@ public class HorizontalScrollView extends android.widget.HorizontalScrollView { // Calling this with the present values causes it to re-claim them this.scrollTo(scrollX, scrollY); + CommonLayoutParams.restoreOriginalParams(this); } @Override diff --git a/widgets/src/main/java/org/nativescript/widgets/StackLayout.java b/widgets/src/main/java/org/nativescript/widgets/StackLayout.java index 73d83b061..4186ffac7 100644 --- a/widgets/src/main/java/org/nativescript/widgets/StackLayout.java +++ b/widgets/src/main/java/org/nativescript/widgets/StackLayout.java @@ -31,7 +31,9 @@ public class StackLayout extends LayoutBase { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int childState = 0; + CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec); + + int childState = 0; int measureWidth = 0; int measureHeight = 0; @@ -77,7 +79,6 @@ public class StackLayout extends LayoutBase { continue; } - CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec); if (isVertical) { CommonLayoutParams.measureChild(child, childMeasureSpec, MeasureSpec.makeMeasureSpec(remainingLength, measureSpecMode)); final int childMeasuredWidth = CommonLayoutParams.getDesiredWidth(child); @@ -118,13 +119,14 @@ public class StackLayout extends LayoutBase { @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { - if (this._orientation == Orientation.vertical) { this.layoutVertical(l, t, r, b); } else { this.layoutHorizontal(l, t, r, b); } + + CommonLayoutParams.restoreOriginalParams(this); } private void layoutVertical(int left, int top, int right, int bottom) { @@ -138,7 +140,7 @@ public class StackLayout extends LayoutBase { int childLeft = paddingLeft; int childRight = right - left - paddingRight; - int gravity = getGravity(this); + int gravity = LayoutBase.getGravity(this); final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; switch (verticalGravity) { @@ -164,8 +166,7 @@ public class StackLayout extends LayoutBase { continue; } - CommonLayoutParams childLayoutParams = (CommonLayoutParams)child.getLayoutParams(); - int childHeight = child.getMeasuredHeight() + childLayoutParams.topMargin + childLayoutParams.bottomMargin; + int childHeight = CommonLayoutParams.getDesiredHeight(child); CommonLayoutParams.layoutChild(child, childLeft, childTop, childRight, childTop + childHeight); childTop += childHeight; } @@ -183,7 +184,7 @@ public class StackLayout extends LayoutBase { int childLeft = 0; int childBottom = bottom - top - paddingBottom; - int gravity = getGravity(this); + int gravity = LayoutBase.getGravity(this); final int horizontalGravity = Gravity.getAbsoluteGravity(gravity, this.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK; switch (horizontalGravity) { @@ -209,8 +210,7 @@ public class StackLayout extends LayoutBase { continue; } - CommonLayoutParams childLayoutParams = (CommonLayoutParams)child.getLayoutParams(); - int childWidth = child.getMeasuredWidth() + childLayoutParams.leftMargin + childLayoutParams.rightMargin; + int childWidth = CommonLayoutParams.getDesiredWidth(child); CommonLayoutParams.layoutChild(child, childLeft, childTop, childLeft + childWidth, childBottom); childLeft += childWidth; } diff --git a/widgets/src/main/java/org/nativescript/widgets/TabStrip.java b/widgets/src/main/java/org/nativescript/widgets/TabStrip.java index 700d48fc0..fa6636e16 100644 --- a/widgets/src/main/java/org/nativescript/widgets/TabStrip.java +++ b/widgets/src/main/java/org/nativescript/widgets/TabStrip.java @@ -27,7 +27,7 @@ import android.view.View; import android.widget.LinearLayout; class TabStrip extends LinearLayout { - + private static final int DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS = 0; private static final byte DEFAULT_BOTTOM_BORDER_COLOR_ALPHA = 0x26; private static final int SELECTED_INDICATOR_THICKNESS_DIPS = 3; @@ -53,13 +53,14 @@ class TabStrip extends LinearLayout { TabStrip(Context context, AttributeSet attrs) { super(context, attrs); + setWillNotDraw(false); final float density = getResources().getDisplayMetrics().density; TypedValue outValue = new TypedValue(); context.getTheme().resolveAttribute(android.R.attr.colorForeground, outValue, true); - final int themeForegroundColor = outValue.data; + final int themeForegroundColor = outValue.data; mDefaultBottomBorderColor = setColorAlpha(themeForegroundColor, DEFAULT_BOTTOM_BORDER_COLOR_ALPHA); diff --git a/widgets/src/main/java/org/nativescript/widgets/VerticalScrollView.java b/widgets/src/main/java/org/nativescript/widgets/VerticalScrollView.java index e03a1f9e7..53aa9d817 100644 --- a/widgets/src/main/java/org/nativescript/widgets/VerticalScrollView.java +++ b/widgets/src/main/java/org/nativescript/widgets/VerticalScrollView.java @@ -65,7 +65,9 @@ public class VerticalScrollView extends ScrollView { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // Don't call measure because it will measure content twice. + CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec); + + // Don't call measure because it will measure content twice. // ScrollView is expected to have single child so we measure only the first child. View child = this.getChildCount() > 0 ? this.getChildAt(0) : null; if (child == null) { @@ -75,7 +77,6 @@ public class VerticalScrollView extends ScrollView { this.setPadding(0, 0, 0, 0); } else { - CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec); CommonLayoutParams.measureChild(child, widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); this.contentMeasuredWidth = CommonLayoutParams.getDesiredWidth(child); this.contentMeasuredHeight = CommonLayoutParams.getDesiredHeight(child); @@ -144,6 +145,8 @@ public class VerticalScrollView extends ScrollView { // Calling this with the present values causes it to re-claim them this.scrollTo(scrollX, scrollY); + + CommonLayoutParams.restoreOriginalParams(this); } @Override diff --git a/widgets/src/main/java/org/nativescript/widgets/WrapLayout.java b/widgets/src/main/java/org/nativescript/widgets/WrapLayout.java index 40858fd0f..e246ed923 100644 --- a/widgets/src/main/java/org/nativescript/widgets/WrapLayout.java +++ b/widgets/src/main/java/org/nativescript/widgets/WrapLayout.java @@ -60,8 +60,9 @@ public class WrapLayout extends LayoutBase { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - - int measureWidth = 0; + CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec); + + int measureWidth = 0; int measureHeight = 0; int width = MeasureSpec.getSize(widthMeasureSpec); @@ -91,8 +92,7 @@ public class WrapLayout extends LayoutBase { if (child.getVisibility() == View.GONE) { continue; } - - CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec); + CommonLayoutParams.measureChild(child, childWidthMeasureSpec, childHeightMeasureSpec); final int childMeasuredWidth = CommonLayoutParams.getDesiredWidth(child); final int childMeasuredHeight = CommonLayoutParams.getDesiredHeight(child); @@ -162,7 +162,6 @@ public class WrapLayout extends LayoutBase { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - boolean isVertical = this._orientation == Orientation.vertical; int paddingLeft = this.getPaddingLeft(); int paddingRight = this.getPaddingRight(); @@ -187,7 +186,6 @@ public class WrapLayout extends LayoutBase { int length = this._lengths.get(rowOrColumn); if (isVertical) { - childWidth = length; childHeight = this._itemHeight > 0 ? this._itemHeight : childHeight; if (childTop + childHeight > childrenLength) { @@ -233,5 +231,7 @@ public class WrapLayout extends LayoutBase { childLeft += childWidth; } } + + CommonLayoutParams.restoreOriginalParams(this); } -} +} \ No newline at end of file diff --git a/widgets/widgets.iml b/widgets/widgets.iml index c34c911b9..30f3119ae 100644 --- a/widgets/widgets.iml +++ b/widgets/widgets.iml @@ -65,23 +65,14 @@ + - - - - - - - - - - @@ -92,5 +83,6 @@ + \ No newline at end of file