Support selectable={true} property on Text fields on Android.

Summary:
Explain the **motivation** for making this change. What existing problem does the pull request solve?

This adds support for a text field that the user can click-and-drag to select text (which can then be copied using the native selected-text-hover-widget).

I'd love to add this to iOS too, but iOS appears to draw glyphs directly to the screen for its <Text> widget (versus using UITextField), so it might be too difficult to support there. But at least I can support my Android users with this change.

Let me know if/what kind of "demonstrate the code is solid" you would like for this. A screenshot of selected text with this property set?
Closes https://github.com/facebook/react-native/pull/8028

Differential Revision: D3474196

Pulled By: bestander

fbshipit-source-id: 8d3656681265a0e6229bfa13ff2ae021e894d3cd
This commit is contained in:
Mike Lambert 2016-06-22 19:07:31 -07:00 committed by Facebook Github Bot 9
parent 590f90fe2e
commit 6cd712713b
3 changed files with 16 additions and 0 deletions

View File

@ -378,6 +378,11 @@ var TextExample = React.createClass({
No maximum lines specified no matter now much I write here. If I keep writing it{"'"}ll just keep going and going
</Text>
</UIExplorerBlock>
<UIExplorerBlock title="selectable attribute">
<Text selectable={true}>
This text is selectable if you click-and-hold, and will offer the native Android selection menus.
</Text>
</UIExplorerBlock>
<UIExplorerBlock title="Inline images">
<Text>
This text contains an inline image <Image source={require('./flux.png')}/>. Neat, huh?

View File

@ -31,6 +31,7 @@ const viewConfig = {
numberOfLines: true,
lineBreakMode: true,
allowFontScaling: true,
selectable: true,
}),
uiViewClassName: 'RCTText',
};
@ -95,6 +96,11 @@ const Text = React.createClass({
* This function is called on long press.
*/
onLongPress: React.PropTypes.func,
/**
* Lets the user select text, to use the native copy and paste functionality.
* @platform android
*/
selectable: React.PropTypes.bool,
/**
* When true, no visual change is made when text is pressed down. By
* default, a gray oval highlights the text on press down.

View File

@ -112,6 +112,11 @@ public class ReactTextViewManager extends BaseViewManager<ReactTextView, ReactTe
}
}
@ReactProp(name = "selectable")
public void setSelectable(ReactTextView view, boolean isSelectable) {
view.setTextIsSelectable(isSelectable);
}
@Override
public void updateExtraData(ReactTextView view, Object extraData) {
ReactTextUpdate update = (ReactTextUpdate) extraData;