diff --git a/README.md b/README.md index 2c3b852..79cc9c3 100644 --- a/README.md +++ b/README.md @@ -47,5 +47,6 @@ let NumberPicker = require('react-native-numberpicker'); onSelect={(value) => { console.log('onSelect', value); }} + keyboardInputEnabled={true} /> ``` \ No newline at end of file diff --git a/index.android.js b/index.android.js index 47b1fe7..10a6877 100644 --- a/index.android.js +++ b/index.android.js @@ -1,4 +1,4 @@ -import { Component, PropTypes } from 'react'; +import React, { Component, PropTypes } from 'react'; import { requireNativeComponent, View} from 'react-native'; var REF_PICKER = 'numberpicker'; @@ -28,9 +28,6 @@ class NumberPicker extends Component { if (this.props.onSelect) this.props.onSelect(event.nativeEvent.value); - if (this.refs[REF_PICKER] && this.state.selectedIndex !== event.nativeEvent.value) - this.refs[REF_PICKER].setNativeProps({selected: this.state.selectedIndex}); - } render() { @@ -44,7 +41,7 @@ class NumberPicker extends Component { onChange={this._onChange} style={[{height:this.props.height}, style && style]} {...otherProps} - /> + /> ); } } @@ -52,6 +49,7 @@ class NumberPicker extends Component { NumberPicker.defaultProps = { selectedIndex: 0, height: 100, + keyboardInputEnabled: true }; NumberPicker.propTypes = { @@ -60,6 +58,7 @@ NumberPicker.propTypes = { selectedIndex: PropTypes.number, values: PropTypes.arrayOf(PropTypes.string).isRequired, onSelect: PropTypes.func, + keyboardInputEnabled: PropTypes.bool }; var NativeNumberPicker = requireNativeComponent('RNNumberPicker', NumberPicker, { diff --git a/package.json b/package.json index fe0af59..522fa0b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-numberpicker", - "version": "0.0.4", + "version": "0.0.5", "description": "React Native Android NumberPicker", "repository": { "type": "git", diff --git a/src/main/java/io/fixd/numberpicker/RNNumberPickerChangeEvent.java b/src/main/java/io/fixd/numberpicker/RNNumberPickerChangeEvent.java deleted file mode 100644 index 1ad091f..0000000 --- a/src/main/java/io/fixd/numberpicker/RNNumberPickerChangeEvent.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.fixd.reactnativenumberpicker; - -import com.facebook.react.bridge.Arguments; -import com.facebook.react.bridge.WritableMap; -import com.facebook.react.uimanager.events.Event; -import com.facebook.react.uimanager.events.RCTEventEmitter; - -public class RNNumberPickerChangeEvent extends Event { - public static final String EVENT_NAME = "topChange"; - - private final int mValue; - - public RNNumberPickerChangeEvent(int id, long uptimeMillis, int value) { - super(id, uptimeMillis); - mValue = value; - } - - @Override - public String getEventName() { - return EVENT_NAME; - } - - @Override - public void dispatch(RCTEventEmitter rctEventEmitter) { - rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData()); - } - - private WritableMap serializeEventData() { - WritableMap eventData = Arguments.createMap(); - eventData.putInt("value", mValue); - return eventData; - } -} \ No newline at end of file diff --git a/src/main/java/io/fixd/numberpicker/RNNumberPicker.java b/src/main/java/io/fixd/reactnativenumberpicker/RNNumberPicker.java similarity index 87% rename from src/main/java/io/fixd/numberpicker/RNNumberPicker.java rename to src/main/java/io/fixd/reactnativenumberpicker/RNNumberPicker.java index 49c2d2f..5d0b890 100644 --- a/src/main/java/io/fixd/numberpicker/RNNumberPicker.java +++ b/src/main/java/io/fixd/reactnativenumberpicker/RNNumberPicker.java @@ -33,7 +33,19 @@ public RNNumberPicker(Context context, AttributeSet attrs) { super(context, attrs); } - public RNNumberPicker(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } + public RNNumberPicker(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public void setKeyboardInputEnabled(boolean enabled) { + if(!enabled) { + this.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); + } + else { + this.setDescendantFocusability(NumberPicker.FOCUS_AFTER_DESCENDANTS); + } + } + public void setOnChangeListener(@Nullable OnChangeListener onValueChangeListener) { setOnValueChangedListener( diff --git a/src/main/java/io/fixd/numberpicker/RNNumberPickerManager.java b/src/main/java/io/fixd/reactnativenumberpicker/RNNumberPickerManager.java similarity index 62% rename from src/main/java/io/fixd/numberpicker/RNNumberPickerManager.java rename to src/main/java/io/fixd/reactnativenumberpicker/RNNumberPickerManager.java index 5cbc007..cc4b70b 100644 --- a/src/main/java/io/fixd/numberpicker/RNNumberPickerManager.java +++ b/src/main/java/io/fixd/reactnativenumberpicker/RNNumberPickerManager.java @@ -2,6 +2,9 @@ import javax.annotation.Nullable; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.ReactContext; +import com.facebook.react.bridge.WritableMap; import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.uimanager.SimpleViewManager; import com.facebook.react.uimanager.ThemedReactContext; @@ -11,14 +14,18 @@ import com.facebook.react.bridge.ReadableArray; import com.facebook.react.uimanager.UIProp; import com.facebook.react.uimanager.ViewProps; +import com.facebook.react.uimanager.events.RCTEventEmitter; import java.lang.Integer; import java.lang.String; -public class RNNumberPickerManager extends SimpleViewManager { +public class RNNumberPickerManager extends SimpleViewManager + implements RNNumberPicker.OnChangeListener { public static final String REACT_CLASS = "RNNumberPicker"; + private RNNumberPicker view; + @Override public String getName() { return REACT_CLASS; @@ -26,7 +33,8 @@ public String getName() { @Override protected RNNumberPicker createViewInstance(ThemedReactContext reactContext) { - return new RNNumberPicker(reactContext); + this.view = new RNNumberPicker(reactContext); + return this.view; } @ReactProp(name = "values") @@ -46,32 +54,24 @@ public void setValue(RNNumberPicker view, Integer selected) { view.setValue(selected); } + @ReactProp(name = "keyboardInputEnabled") + public void setKeyboardInputEnabled(RNNumberPicker view, Boolean enabled) { + view.setKeyboardInputEnabled(enabled); + } + @Override protected void addEventEmitters(final ThemedReactContext reactContext, final RNNumberPicker picker) { - picker.setOnChangeListener( - new RNNumberPickerEventEmitter( - picker, - reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher() - ) - ); + picker.setOnChangeListener(this); } - private static class RNNumberPickerEventEmitter implements RNNumberPicker.OnChangeListener { - - private final RNNumberPicker mRNNumberPicker; - private final EventDispatcher mEventDispatcher; - - public RNNumberPickerEventEmitter(RNNumberPicker reactNumberPicker, EventDispatcher eventDispatcher) { - mRNNumberPicker = reactNumberPicker; - mEventDispatcher = eventDispatcher; - } - - @Override - public void onValueChange(int value) { - mEventDispatcher.dispatchEvent( - new RNNumberPickerChangeEvent(mRNNumberPicker.getId(), SystemClock.nanoTime(), value) - ); - } + @Override + public void onValueChange(int value) { + WritableMap event = Arguments.createMap(); + event.putInt("value", value); + ReactContext reactContext = (ReactContext) view.getContext(); + reactContext.getJSModule(RCTEventEmitter.class) + .receiveEvent(view.getId(), "topChange", event); } + } diff --git a/src/main/java/io/fixd/numberpicker/RNNumberPickerPackage.java b/src/main/java/io/fixd/reactnativenumberpicker/RNNumberPickerPackage.java similarity index 100% rename from src/main/java/io/fixd/numberpicker/RNNumberPickerPackage.java rename to src/main/java/io/fixd/reactnativenumberpicker/RNNumberPickerPackage.java