diff --git a/.gitignore b/.gitignore index bda3a4e..2af2cd6 100755 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ coverage.html # Dependency directory node_modules +example/node_modules/ # Example build directory example/dist diff --git a/example/.flowconfig b/example/.flowconfig index a76425e..834765f 100644 --- a/example/.flowconfig +++ b/example/.flowconfig @@ -44,4 +44,5 @@ suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError unsafe.enable_getters_and_setters=true [version] -^0.42.0 + +^0.42.0 \ No newline at end of file diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index d36e481..5313155 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -115,7 +115,7 @@ android { variant.outputs.each { output -> // For each separate APK per architecture, set a unique version code as described here: // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits - def versionCodes = ["armeabi-v7a":1, "x86":2] + def versionCodes = ["armeabi-v7a": 1, "x86": 2] def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = @@ -128,8 +128,10 @@ android { dependencies { compile project(':react-native-svg') compile fileTree(dir: "libs", include: ["*.jar"]) - compile "com.android.support:appcompat-v7:23.0.1" - compile "com.facebook.react:react-native:+" // From node_modules + // From node_modules + compile 'com.android.support:appcompat-v7:23.4.0' + compile 'com.facebook.react:react-native:+' + compile 'com.android.support:design:23.4.0' } // Run this once to be able to run the application with BUCK diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index 8275835..a9d2590 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -1,23 +1,24 @@ + - - - + + + + + + + - @@ -29,4 +30,4 @@ - + \ No newline at end of file diff --git a/example/android/app/src/main/java/com/example/ExampleReactPackage.java b/example/android/app/src/main/java/com/example/ExampleReactPackage.java new file mode 100644 index 0000000..a3d0931 --- /dev/null +++ b/example/android/app/src/main/java/com/example/ExampleReactPackage.java @@ -0,0 +1,39 @@ +package com.example; + +/** + * Created by young on 2017/5/10. + */ + +import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.JavaScriptModule; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ViewManager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class ExampleReactPackage implements ReactPackage { + + @Override + public List> createJSModules() { + return Collections.emptyList(); + } + + @Override + public List createViewManagers(ReactApplicationContext reactContext) { + return Collections.emptyList(); + } + + @Override + public List createNativeModules( + ReactApplicationContext reactContext) { + List modules = new ArrayList<>(); + + modules.add(new RNBridge(reactContext)); + + return modules; + } + +} diff --git a/example/android/app/src/main/java/com/example/HomeActivity.java b/example/android/app/src/main/java/com/example/HomeActivity.java new file mode 100644 index 0000000..43d566d --- /dev/null +++ b/example/android/app/src/main/java/com/example/HomeActivity.java @@ -0,0 +1,52 @@ +package com.example; + +import android.content.Intent; +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.View; +import android.widget.Button; + +import java.io.IOError; + +public class HomeActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_home); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) + .setAction("Action", null).show(); + } + }); + + Button bt = (Button) findViewById(R.id.button); + bt.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.i("匿名内部类", "点击事件"); + + + try { + Intent intent = new Intent(); + intent.setClass(HomeActivity.this, MainActivity.class); + startActivity(intent); + } catch (IOError error) { + error.printStackTrace(); + } + + } + }); + } + +} diff --git a/example/android/app/src/main/java/com/example/MainApplication.java b/example/android/app/src/main/java/com/example/MainApplication.java index 748986d..0961a20 100644 --- a/example/android/app/src/main/java/com/example/MainApplication.java +++ b/example/android/app/src/main/java/com/example/MainApplication.java @@ -14,11 +14,23 @@ public class MainApplication extends Application implements ReactApplication { - private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { - @Override - public boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } +// private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { +// @Override +// public boolean getUseDeveloperSupport() { +// return BuildConfig.DEBUG; +// } +// +// @Override +// protected List getPackages() { +// return Arrays.asList( +// new MainReactPackage(), +// new RNSvgPackage(), +// new ExampleReactPackage() +// ); +// } +// }; + + private final ReactNativeHost mReactNativeHost = new RNHost(this); @Override protected List getPackages() { @@ -29,7 +41,7 @@ protected List getPackages() { } }; - @Override + @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; } diff --git a/example/android/app/src/main/java/com/example/RNActivity.java b/example/android/app/src/main/java/com/example/RNActivity.java new file mode 100644 index 0000000..89d88d2 --- /dev/null +++ b/example/android/app/src/main/java/com/example/RNActivity.java @@ -0,0 +1,113 @@ +package com.example; + +import android.app.Activity; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.Settings; +import android.util.Log; +import android.view.KeyEvent; + +import com.facebook.react.*; +import com.facebook.react.BuildConfig; +import com.facebook.react.common.LifecycleState; +import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; +import com.facebook.react.shell.MainReactPackage; + +/** + * Created by young on 2017/5/10. + */ + +public class RNActivity extends Activity implements DefaultHardwareBackBtnHandler { + + private ReactRootView rnRootView; + private ReactInstanceManager rnInstanceManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { +// if (!Settings.canDrawOverlays(this)) { +// Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, +// Uri.parse("package:" + getPackageName())); +// startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE); +// } +// } + + rnRootView = new ReactRootView(this); + Log.i("加载RN模块", "测试"); + ReactInstanceManagerBuilder builder = ReactInstanceManager.builder().setApplication(getApplication()) + .setBundleAssetName("index.android.bundle") + .setJSMainModuleName("index.android") + .addPackage(new MainReactPackage()) + .setUseDeveloperSupport(true) + .setInitialLifecycleState(LifecycleState.RESUMED); + + RNHost host = (RNHost) ((ReactApplication) getApplication()).getReactNativeHost(); + + for (ReactPackage reactPackage : host.packages()) { + builder.addPackage(reactPackage); + } + + rnInstanceManager = builder.build(); + rnRootView.startReactApplication(rnInstanceManager, "example", null); + + setContentView(rnRootView); + } + + @Override + public void invokeDefaultOnBackPressed() { + super.onBackPressed(); + } + + + @Override + protected void onPause() { + super.onPause(); + + if (rnInstanceManager != null) { + rnInstanceManager.onHostPause(this); + } + } + + @Override + protected void onResume() { + super.onResume(); + + if (rnInstanceManager != null) { + rnInstanceManager.onHostResume(this, this); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + if (rnInstanceManager != null) { + rnInstanceManager.onHostDestroy(this); + } + } + + @Override + public void onBackPressed() { + + if (rnInstanceManager != null) { + rnInstanceManager.onBackPressed(); + } else { + super.onBackPressed(); + } + } + + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + + if (keyCode == KeyEvent.KEYCODE_MENU && rnInstanceManager != null) { + rnInstanceManager.showDevOptionsDialog(); + return true; + } + return super.onKeyUp(keyCode, event); + } +} diff --git a/example/android/app/src/main/java/com/example/RNBridge.java b/example/android/app/src/main/java/com/example/RNBridge.java new file mode 100644 index 0000000..16c47a9 --- /dev/null +++ b/example/android/app/src/main/java/com/example/RNBridge.java @@ -0,0 +1,40 @@ +package com.example; + +/** + * Created by young on 2017/5/10. + */ + + +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Nullable; + +public class RNBridge extends ReactContextBaseJavaModule { + + public RNBridge(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public String getName() { + return "RNBridge"; + } + + @Nullable + @Override + public Map getConstants() { + + final Map constants = new HashMap<>(); + constants.put("abc", "ABC"); + constants.put("bcd", "BCD"); + + return constants; + } +} diff --git a/example/android/app/src/main/java/com/example/RNHost.java b/example/android/app/src/main/java/com/example/RNHost.java new file mode 100644 index 0000000..80160b9 --- /dev/null +++ b/example/android/app/src/main/java/com/example/RNHost.java @@ -0,0 +1,40 @@ +package com.example; + +import android.app.Application; + +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.shell.MainReactPackage; +import com.horcrux.svg.RNSvgPackage; + +import java.util.Arrays; +import java.util.List; + +/** + * Created by young on 2017/5/10. + */ + +public class RNHost extends ReactNativeHost { + + public RNHost(Application application) { + super(application); + } + + @Override + public boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + return Arrays.asList( + new MainReactPackage(), + new RNSvgPackage(), + new ExampleReactPackage() + ); + } + + public List packages() { + return this.getPackages(); + } +} diff --git a/example/android/app/src/main/res/layout/activity_home.xml b/example/android/app/src/main/res/layout/activity_home.xml new file mode 100644 index 0000000..365fef0 --- /dev/null +++ b/example/android/app/src/main/res/layout/activity_home.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + +