diff --git a/AndroidSegmented.js b/AndroidSegmented.android.js similarity index 88% rename from AndroidSegmented.js rename to AndroidSegmented.android.js index a7ac396..e3afe0d 100644 --- a/AndroidSegmented.js +++ b/AndroidSegmented.android.js @@ -1,7 +1,8 @@ 'use strict'; -var React = require('react-native'); -var { requireNativeComponent, PropTypes, View } = React; +var React = require('react'); +var { PropTypes } = React; +var { requireNativeComponent, View } = require('react-native'); var NativeAndroidSegmented = requireNativeComponent('AndroidSegmented', AndroidSegmented); @@ -51,4 +52,4 @@ AndroidSegmented.defaultProps = { }; -module.exports = AndroidSegmented; \ No newline at end of file +module.exports = AndroidSegmented; diff --git a/AndroidSegmented.ios.js b/AndroidSegmented.ios.js new file mode 100644 index 0000000..cb1e199 --- /dev/null +++ b/AndroidSegmented.ios.js @@ -0,0 +1,15 @@ +/** + * + * @providesModule AndroidSegmented + * @flow + */ +'use strict'; + +const AndroidSegmented = { + render() { + console.error('Not implemented for iOS, perhaps you wanted to use SegmentedControlIOS?'); + } +}; + +module.exports = AndroidSegmented; + diff --git a/build.gradle b/build.gradle index 945f9a4..7e1c98b 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.1.1' compile 'info.hoang8f:android-segmented:1.0.6' - compile 'com.facebook.react:react-native:0.19.+' + compile 'com.facebook.react:react-native:+' } //react-native run-android //adb reverse tcp:8081 tcp:8081 diff --git a/package.json b/package.json index 715dbf2..69fc4fd 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "react-native-segmented-android", "version": "1.0.4", "description": "a high imitation of iOS segmented Controls", - "main": "AndroidSegmented.js", + "main": "AndroidSegmented", "scripts": { "test": "react-native start" }, @@ -19,6 +19,7 @@ "author": "zzyyppqq", "license": "ISC", "peerDependencies": { + "react": ">= 0.14.0", "react-native": ">= 0.18.0" } } diff --git a/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedEvent.java b/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedEvent.java index 5aa6c22..830493b 100644 --- a/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedEvent.java +++ b/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedEvent.java @@ -15,8 +15,8 @@ public class AndroidSegmentedEvent extends Event { public static final String EVENT_NAME = "topChange"; private final int selectedPosition; - public AndroidSegmentedEvent(int viewId, long timestampMs, int selectedPosition) { - super(viewId, timestampMs); + public AndroidSegmentedEvent(int viewId, int selectedPosition) { + super(viewId); this.selectedPosition = selectedPosition; } @@ -42,7 +42,6 @@ private WritableMap serializeEventData() { WritableMap eventData = Arguments.createMap(); // eventData.putInt("target", getViewTag()); eventData.putInt("selected", getPosition()); - Log.e("AAA","position="+getPosition()); return eventData; } diff --git a/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedManager.java b/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedManager.java index 6b1216d..19b42c8 100644 --- a/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedManager.java +++ b/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedManager.java @@ -25,6 +25,8 @@ public class AndroidSegmentedManager extends SimpleViewManager private Context context; + private int selectedPosition = -1; + @Override public String getName() { return REACT_CLASS; @@ -55,7 +57,6 @@ public void onCheckedChanged(RadioGroup group, int checkedId) { .dispatchEvent( new AndroidSegmentedEvent( view.getId(), - SystemClock.uptimeMillis(), i)); } } @@ -65,11 +66,27 @@ public void onCheckedChanged(RadioGroup group, int checkedId) { } + protected void onAfterUpdateTransaction(AndroidSegmented view) { + // We don't want to update selectedPosition when it's set, + // as the childText may not have been set yet. Resulting in array-out-of-bounds accesses. + // So we delay setChecked()-ing until here. + // Also re-sets any checked values after a childText change, too. + int childCount = view.getChildCount(); + for (int i = 0; i < childCount; ++i) { + RadioButton radioBt = (RadioButton) (view.getChildAt(i)); + radioBt.setChecked(i == selectedPosition); + } + // Ensure our tintColor and orientation gets applied to the existing view children, + // even if they were setup before the view children were constructed to receive them. + view.updateBackground(); + + } @ReactProp(name = "childText") public void setChildText(AndroidSegmented view, ReadableArray data) { int childCount = data.size(); + view.removeAllViews(); for (int i = 0; i < childCount; ++i) { RadioButton child = (RadioButton) LayoutInflater.from(context).inflate(R.layout.radio_button, null); @@ -83,8 +100,7 @@ public void setChildText(AndroidSegmented view, ReadableArray data) { @ReactProp(name = "selectedPosition") public void setSelectedChild(AndroidSegmented view, int position) { - RadioButton radioBt = (RadioButton) (view.getChildAt(position)); - radioBt.setChecked(true); + selectedPosition = position; }