From 1767a0a82858b6329d6ffecac2734d00b59b6057 Mon Sep 17 00:00:00 2001 From: Emil Sjolander Date: Mon, 23 May 2016 10:15:57 -0700 Subject: [PATCH] Correctly implement measure callback with measure modes Reviewed By: astreet Differential Revision: D3330139 fbshipit-source-id: 2ea6e4b463817e9ccc5f2d9395736f68f8d972e4 --- .../views/textinput/ReactTextInputShadowNode.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputShadowNode.java index d3b4b6841..ad2ea0b55 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputShadowNode.java @@ -13,6 +13,7 @@ import javax.annotation.Nullable; import android.text.Spannable; import android.util.TypedValue; +import android.view.View.MeasureSpec; import android.view.ViewGroup; import android.widget.EditText; @@ -75,7 +76,6 @@ public class ReactTextInputShadowNode extends ReactTextShadowNode implements // measure() should never be called before setThemedContext() EditText editText = Assertions.assertNotNull(mEditText); - measureOutput.width = widthMode == CSSMeasureMode.UNDEFINED ? CSSConstants.UNDEFINED : width; editText.setTextSize( TypedValue.COMPLEX_UNIT_PX, mFontSize == UNSET ? @@ -91,10 +91,21 @@ public class ReactTextInputShadowNode extends ReactTextShadowNode implements editText.setLines(mNumberOfLines); } - editText.measure(0 /* unspecified */, 0 /* unspecified */); + editText.measure(getMeasureSpec(width, widthMode), getMeasureSpec(height, heightMode)); + measureOutput.width = editText.getMeasuredWidth(); measureOutput.height = editText.getMeasuredHeight(); } + private int getMeasureSpec(float size, CSSMeasureMode mode) { + if (mode == CSSMeasureMode.EXACTLY) { + return MeasureSpec.makeMeasureSpec((int) size, MeasureSpec.EXACTLY); + } else if (mode == CSSMeasureMode.AT_MOST) { + return MeasureSpec.makeMeasureSpec((int) size, MeasureSpec.AT_MOST); + } else { + return MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + } + } + @Override public void onBeforeLayout() { // We don't have to measure the text within the text input.