react-native-navigation的迁移库

NavigationModule.java 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package com.reactnativenavigation.react;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import com.facebook.react.ReactRootView;
  5. import com.facebook.react.bridge.ReactApplicationContext;
  6. import com.facebook.react.bridge.ReactContextBaseJavaModule;
  7. import com.facebook.react.bridge.ReactMethod;
  8. import com.facebook.react.bridge.ReadableArray;
  9. import com.facebook.react.bridge.ReadableMap;
  10. import com.facebook.react.bridge.ReadableMapKeySetIterator;
  11. import com.reactnativenavigation.controllers.NavigationActivity;
  12. import com.reactnativenavigation.layout.LayoutFactory;
  13. import com.reactnativenavigation.layout.LayoutNode;
  14. import com.reactnativenavigation.layout.StackLayout;
  15. import com.reactnativenavigation.layout.bottomtabs.BottomTabsCreator;
  16. import java.util.ArrayList;
  17. import java.util.HashMap;
  18. import java.util.Map;
  19. public class NavigationModule extends ReactContextBaseJavaModule {
  20. public static final String NAME = "RNNBridgeModule";
  21. public NavigationModule(ReactApplicationContext reactContext) {
  22. super(reactContext);
  23. }
  24. @Override
  25. public String getName() {
  26. return NAME;
  27. }
  28. @ReactMethod
  29. public void setRoot(final ReadableMap layoutTree) {
  30. NavigationActivity.instance.runOnUiThread(new Runnable() {
  31. @Override
  32. public void run() {
  33. LayoutFactory factory =
  34. new LayoutFactory(NavigationActivity.instance, new LayoutFactory.ReactRootViewCreator() {
  35. @Override
  36. public View create(String id, String name) {
  37. ReactRootView rootView = new ReactRootView(NavigationActivity.instance);
  38. Bundle opts = new Bundle();
  39. opts.putString("id", id);
  40. rootView.startReactApplication(NavigationActivity.instance.getHost().getReactInstanceManager(), name, opts);
  41. return rootView;
  42. }
  43. }, new BottomTabsCreator());
  44. final LayoutNode layoutTreeRoot = readableMapToLayoutNode(layoutTree);
  45. final View rootView = factory.create(layoutTreeRoot);
  46. NavigationActivity.instance.setContentView(rootView);
  47. }
  48. });
  49. }
  50. @ReactMethod
  51. public void push(String onContainerId, final ReadableMap layout) {
  52. NavigationActivity.instance.runOnUiThread(new Runnable() {
  53. @Override
  54. public void run() {
  55. LayoutFactory factory =
  56. new LayoutFactory(NavigationActivity.instance, new LayoutFactory.ReactRootViewCreator() {
  57. @Override
  58. public View create(String id, String name) {
  59. ReactRootView rootView = new ReactRootView(NavigationActivity.instance);
  60. Bundle opts = new Bundle();
  61. opts.putString("id", id);
  62. rootView.startReactApplication(NavigationActivity.instance.getHost().getReactInstanceManager(), name, opts);
  63. return rootView;
  64. }
  65. }, new BottomTabsCreator());
  66. final LayoutNode layoutNode = readableMapToLayoutNode(layout);
  67. final View rootView = factory.create(layoutNode);
  68. ((StackLayout) NavigationActivity.instance.getContentView()).push(rootView);
  69. }
  70. });
  71. }
  72. @ReactMethod
  73. public void pop(String onContainerId) {
  74. NavigationActivity.instance.runOnUiThread(new Runnable() {
  75. @Override
  76. public void run() {
  77. ((StackLayout) NavigationActivity.instance.getContentView()).pop();
  78. }
  79. });
  80. }
  81. private LayoutNode readableMapToLayoutNode(ReadableMap readableMap) {
  82. final LayoutNode layoutNode = new LayoutNode();
  83. layoutNode.id = readableMap.getString("id");
  84. layoutNode.type = readableMap.getString("type");
  85. layoutNode.data = readableMapToJavaMap(readableMap.getMap("data"));
  86. ReadableArray childrenNodes = readableMap.getArray("children");
  87. layoutNode.children = new ArrayList<>(childrenNodes.size());
  88. for (int i = 0; i < childrenNodes.size(); i++) {
  89. ReadableMap child = childrenNodes.getMap(i);
  90. layoutNode.children.add(readableMapToLayoutNode(child));
  91. }
  92. return layoutNode;
  93. }
  94. private Map<String, Object> readableMapToJavaMap(ReadableMap readableMap) {
  95. final Map<String, Object> map = new HashMap<>();
  96. for (ReadableMapKeySetIterator it = readableMap.keySetIterator(); it.hasNextKey(); ) {
  97. final String key = it.nextKey();
  98. switch (readableMap.getType(key)) {
  99. case String:
  100. map.put(key, readableMap.getString(key));
  101. break;
  102. case Map:
  103. map.put(key, readableMapToJavaMap(readableMap.getMap(key)));
  104. break;
  105. }
  106. }
  107. return map;
  108. }
  109. }