From f9b97c09766b2d8277f01e69353018f641e5f04b Mon Sep 17 00:00:00 2001 From: Mike Lambert Date: Tue, 24 May 2016 14:50:33 -0400 Subject: [PATCH 1/5] Fix deprecation warnings in 0.25 (that are deprecation errors in 0.26). --- AndroidSegmented.js | 7 ++++--- package.json | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/AndroidSegmented.js b/AndroidSegmented.js index a7ac396..e3afe0d 100644 --- a/AndroidSegmented.js +++ b/AndroidSegmented.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/package.json b/package.json index 715dbf2..1c07650 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "author": "zzyyppqq", "license": "ISC", "peerDependencies": { + "react": ">= 0.14.0", "react-native": ">= 0.18.0" } } From e3f7d901979a6ad57d9d3de810a4afed9fbdadda Mon Sep 17 00:00:00 2001 From: Mike Lambert Date: Tue, 24 May 2016 15:14:42 -0400 Subject: [PATCH 2/5] Previously, importing this module into an iOS project would trigger an warning due to the missing native module. This separates it out into a separate per-platform files to avoid the warning. --- ...oidSegmented.js => AndroidSegmented.android.js | 0 AndroidSegmented.ios.js | 15 +++++++++++++++ package.json | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) rename AndroidSegmented.js => AndroidSegmented.android.js (100%) create mode 100644 AndroidSegmented.ios.js diff --git a/AndroidSegmented.js b/AndroidSegmented.android.js similarity index 100% rename from AndroidSegmented.js rename to AndroidSegmented.android.js 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/package.json b/package.json index 1c07650..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" }, From 8931415ed2db80fe9e5d38e63a7004247438634a Mon Sep 17 00:00:00 2001 From: Mike Lambert Date: Thu, 26 May 2016 21:16:41 -0400 Subject: [PATCH 3/5] Fix non-deterministic property setting, since React can set any property in any order. But most properties only make sense to set *after* setting childText. This ensures that the views get updated and reflected, no matter what order they are set in. --- .../segmented/AndroidSegmentedManager.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedManager.java b/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedManager.java index 6b1216d..a138fb9 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; @@ -65,11 +67,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 +101,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; } From f2357586d89455c245448381cf4bff08347987d2 Mon Sep 17 00:00:00 2001 From: Mike Lambert Date: Thu, 26 May 2016 21:24:46 -0400 Subject: [PATCH 4/5] Remove extraneous logging error. --- .../java/com/higo/zhangyp/segmented/AndroidSegmentedEvent.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedEvent.java b/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedEvent.java index 5aa6c22..56b78a5 100644 --- a/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedEvent.java +++ b/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedEvent.java @@ -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; } From 1a8c1ef678be9c639966e022be04c3a99f82cbf8 Mon Sep 17 00:00:00 2001 From: Mike Lambert Date: Sat, 17 Sep 2016 04:55:11 -0400 Subject: [PATCH 5/5] Make things work with React Native 0.32. --- build.gradle | 2 +- .../com/higo/zhangyp/segmented/AndroidSegmentedEvent.java | 4 ++-- .../com/higo/zhangyp/segmented/AndroidSegmentedManager.java | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) 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/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedEvent.java b/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedEvent.java index 56b78a5..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; } diff --git a/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedManager.java b/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedManager.java index a138fb9..19b42c8 100644 --- a/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedManager.java +++ b/src/main/java/com/higo/zhangyp/segmented/AndroidSegmentedManager.java @@ -57,7 +57,6 @@ public void onCheckedChanged(RadioGroup group, int checkedId) { .dispatchEvent( new AndroidSegmentedEvent( view.getId(), - SystemClock.uptimeMillis(), i)); } }