Skip to content

Commit f453e14

Browse files
Huang Yufacebook-github-bot-7
authored andcommitted
Fix StyleSheet 'textAlign' for AndroidTextInput. Closes #2702
Summary: change `setTextAlign` and `setTextAlignVertical` to receive argument of type `String` (the same as in `StyleSheet`), so that native props and stylesheet props are calling the same ReactMethod - add demo (may not be necessary) Closes #4481 Reviewed By: svcscm Differential Revision: D2823456 Pulled By: mkonicek fb-gh-sync-id: 349d17549f419b5bdc001d70b583423ade06bfe8
1 parent dc96935 commit f453e14

File tree

5 files changed

+38
-49
lines changed

5 files changed

+38
-49
lines changed

Examples/UIExplorer/TextInputExample.android.js

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -348,25 +348,19 @@ exports.examples = [
348348
placeholder="multiline, aligned top-left"
349349
placeholderTextColor="red"
350350
multiline={true}
351-
textAlign="start"
352-
textAlignVertical="top"
353-
style={styles.multiline}
351+
style={[styles.multiline, {textAlign: "left", textAlignVertical: "top"}]}
354352
/>
355353
<TextInput
356354
autoCorrect={true}
357355
placeholder="multiline, aligned center"
358356
placeholderTextColor="green"
359357
multiline={true}
360-
textAlign="center"
361-
textAlignVertical="center"
362-
style={[styles.multiline]}
358+
style={[styles.multiline, {textAlign: "center", textAlignVertical: "center"}]}
363359
/>
364360
<TextInput
365361
autoCorrect={true}
366362
multiline={true}
367-
textAlign="end"
368-
textAlignVertical="bottom"
369-
style={[styles.multiline, {color: 'blue'}]}>
363+
style={[styles.multiline, {color: 'blue'}, {textAlign: "right", textAlignVertical: "bottom"}]}>
370364
<Text style={styles.multiline}>multiline with children, aligned bottom-right</Text>
371365
</TextInput>
372366
</View>

Libraries/Components/TextInput/TextInput.js

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -101,24 +101,6 @@ var TextInput = React.createClass({
101101
* The default value is false.
102102
*/
103103
autoFocus: PropTypes.bool,
104-
/**
105-
* Set the position of the cursor from where editing will begin.
106-
* @platform android
107-
*/
108-
textAlign: PropTypes.oneOf([
109-
'start',
110-
'center',
111-
'end',
112-
]),
113-
/**
114-
* Aligns text vertically within the TextInput.
115-
* @platform android
116-
*/
117-
textAlignVertical: PropTypes.oneOf([
118-
'top',
119-
'center',
120-
'bottom',
121-
]),
122104
/**
123105
* If false, text is not editable. The default value is true.
124106
*/
@@ -491,10 +473,6 @@ var TextInput = React.createClass({
491473

492474
var autoCapitalize =
493475
UIManager.AndroidTextInput.Constants.AutoCapitalizationType[this.props.autoCapitalize];
494-
var textAlign = UIManager.AndroidTextInput.Constants.TextAlign[this.props.textAlign];
495-
var textAlignVertical =
496-
UIManager.AndroidTextInput.Constants.TextAlignVertical[this.props.textAlignVertical];
497-
498476
var children = this.props.children;
499477
var childCount = 0;
500478
ReactChildren.forEach(children, () => ++childCount);
@@ -512,8 +490,6 @@ var TextInput = React.createClass({
512490
style={[this.props.style]}
513491
autoCapitalize={autoCapitalize}
514492
autoCorrect={this.props.autoCorrect}
515-
textAlign={textAlign}
516-
textAlignVertical={textAlignVertical}
517493
keyboardType={this.props.keyboardType}
518494
mostRecentEventCount={0}
519495
multiline={this.props.multiline}

Libraries/Text/TextStylePropTypes.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ var TextStylePropTypes = Object.assign(Object.create(ViewStylePropTypes), {
4646
textAlign: ReactPropTypes.oneOf(
4747
['auto' /*default*/, 'left', 'right', 'center', 'justify']
4848
),
49+
/**
50+
* @platform android
51+
*/
52+
textAlignVertical: ReactPropTypes.oneOf(
53+
['auto' /*default*/, 'top', 'bottom', 'center']
54+
),
4955
/**
5056
* @platform ios
5157
*/

ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public class ViewProps {
7070
public static final String ON = "on";
7171
public static final String RESIZE_MODE = "resizeMode";
7272
public static final String TEXT_ALIGN = "textAlign";
73+
public static final String TEXT_ALIGN_VERTICAL = "textAlignVertical";
7374

7475
public static final String BORDER_WIDTH = "borderWidth";
7576
public static final String BORDER_LEFT_WIDTH = "borderLeftWidth";

ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import android.widget.TextView;
2929

3030
import com.facebook.infer.annotation.Assertions;
31+
import com.facebook.react.bridge.JSApplicationCausedNativeException;
32+
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
3133
import com.facebook.react.bridge.ReactContext;
3234
import com.facebook.react.bridge.ReadableArray;
3335
import com.facebook.react.common.MapBuilder;
@@ -202,14 +204,34 @@ public void setUnderlineColor(ReactEditText view, @Nullable Integer underlineCol
202204
}
203205
}
204206

205-
@ReactProp(name = "textAlign")
206-
public void setTextAlign(ReactEditText view, int gravity) {
207-
view.setGravityHorizontal(gravity);
207+
@ReactProp(name = ViewProps.TEXT_ALIGN)
208+
public void setTextAlign(ReactEditText view, @Nullable String textAlign) {
209+
if (textAlign == null || "auto".equals(textAlign)) {
210+
view.setGravityHorizontal(Gravity.NO_GRAVITY);
211+
} else if ("left".equals(textAlign)) {
212+
view.setGravityHorizontal(Gravity.LEFT);
213+
} else if ("right".equals(textAlign)) {
214+
view.setGravityHorizontal(Gravity.RIGHT);
215+
} else if ("center".equals(textAlign)) {
216+
view.setGravityHorizontal(Gravity.CENTER_HORIZONTAL);
217+
} else {
218+
throw new JSApplicationIllegalArgumentException("Invalid textAlign: " + textAlign);
219+
}
208220
}
209221

210-
@ReactProp(name = "textAlignVertical")
211-
public void setTextAlignVertical(ReactEditText view, int gravity) {
212-
view.setGravityVertical(gravity);
222+
@ReactProp(name = ViewProps.TEXT_ALIGN_VERTICAL)
223+
public void setTextAlignVertical(ReactEditText view, @Nullable String textAlignVertical) {
224+
if (textAlignVertical == null || "auto".equals(textAlignVertical)) {
225+
view.setGravityVertical(Gravity.NO_GRAVITY);
226+
} else if ("top".equals(textAlignVertical)) {
227+
view.setGravityVertical(Gravity.TOP);
228+
} else if ("bottom".equals(textAlignVertical)) {
229+
view.setGravityVertical(Gravity.BOTTOM);
230+
} else if ("center".equals(textAlignVertical)) {
231+
view.setGravityVertical(Gravity.CENTER_VERTICAL);
232+
} else {
233+
throw new JSApplicationIllegalArgumentException("Invalid textAlignVertical: " + textAlignVertical);
234+
}
213235
}
214236

215237
@ReactProp(name = "editable", defaultBoolean = true)
@@ -474,16 +496,6 @@ public void onSelectionChanged(int start, int end) {
474496
@Override
475497
public @Nullable Map getExportedViewConstants() {
476498
return MapBuilder.of(
477-
"TextAlign",
478-
MapBuilder.of(
479-
"start", Gravity.START,
480-
"center", Gravity.CENTER_HORIZONTAL,
481-
"end", Gravity.END),
482-
"TextAlignVertical",
483-
MapBuilder.of(
484-
"top", Gravity.TOP,
485-
"center", Gravity.CENTER_VERTICAL,
486-
"bottom", Gravity.BOTTOM),
487499
"AutoCapitalizationType",
488500
MapBuilder.of(
489501
"none",

0 commit comments

Comments
 (0)