Browse Source

Experimental change to StackView. Prevent screens from getting unmounted when removing them from screen

Guy Carmeli 8 years ago
parent
commit
882e3f0dbc

+ 24
- 0
android/app/src/main/java/com/reactnativenavigation/utils/ReflectionUtils.java View File

1
+package com.reactnativenavigation.utils;
2
+
3
+import java.lang.reflect.Field;
4
+
5
+/**
6
+ * Created by guyc on 14/04/16.
7
+ */
8
+public class ReflectionUtils {
9
+
10
+    public static boolean setBooleanField(Object obj, String name, Boolean value) {
11
+        Field field;
12
+        try {
13
+            field = obj.getClass().getDeclaredField(name);
14
+            field.setAccessible(true);
15
+            field.set(obj, value);
16
+            return true;
17
+        } catch (NoSuchFieldException e) {
18
+            e.printStackTrace();
19
+        } catch (IllegalAccessException e) {
20
+            e.printStackTrace();
21
+        }
22
+        return false;
23
+    }
24
+}

+ 10
- 4
android/app/src/main/java/com/reactnativenavigation/views/RctView.java View File

13
  */
13
  */
14
 public class RctView extends FrameLayout {
14
 public class RctView extends FrameLayout {
15
 
15
 
16
+    private ReactRootView mReactRootView;
17
+
18
+    public ReactRootView getReactRootView() {
19
+        return mReactRootView;
20
+    }
21
+
16
     public RctView(BaseReactActivity ctx, ReactInstanceManager rctInstanceManager, Screen screen) {
22
     public RctView(BaseReactActivity ctx, ReactInstanceManager rctInstanceManager, Screen screen) {
17
         super(ctx);
23
         super(ctx);
18
         setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
24
         setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
19
 
25
 
20
-        ReactRootView root = new ReactRootView(ctx);
21
-        root.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
26
+        mReactRootView = new ReactRootView(ctx);
27
+        mReactRootView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
22
 
28
 
23
         String componentName = screen.screenId;
29
         String componentName = screen.screenId;
24
         Bundle passProps = new Bundle();
30
         Bundle passProps = new Bundle();
26
         passProps.putString(Screen.KEY_NAVIGATOR_ID, screen.navigatorId);
32
         passProps.putString(Screen.KEY_NAVIGATOR_ID, screen.navigatorId);
27
         passProps.putString(Screen.KEY_NAVIGATOR_EVENT_ID, screen.navigatorEventId);
33
         passProps.putString(Screen.KEY_NAVIGATOR_EVENT_ID, screen.navigatorEventId);
28
 
34
 
29
-        root.startReactApplication(rctInstanceManager, componentName, passProps);
35
+        mReactRootView.startReactApplication(rctInstanceManager, componentName, passProps);
30
 
36
 
31
-        addView(root);
37
+        addView(mReactRootView);
32
     }
38
     }
33
 }
39
 }
34
 
40
 

+ 8
- 9
android/app/src/main/java/com/reactnativenavigation/views/ScreenStack.java View File

5
 import android.widget.FrameLayout;
5
 import android.widget.FrameLayout;
6
 
6
 
7
 import com.facebook.react.ReactInstanceManager;
7
 import com.facebook.react.ReactInstanceManager;
8
+import com.facebook.react.ReactRootView;
8
 import com.reactnativenavigation.activities.BaseReactActivity;
9
 import com.reactnativenavigation.activities.BaseReactActivity;
9
 import com.reactnativenavigation.core.RctManager;
10
 import com.reactnativenavigation.core.RctManager;
10
 import com.reactnativenavigation.core.objects.Screen;
11
 import com.reactnativenavigation.core.objects.Screen;
12
+import com.reactnativenavigation.utils.ReflectionUtils;
11
 
13
 
12
 import java.util.Stack;
14
 import java.util.Stack;
13
 
15
 
14
-import static android.view.ViewGroup.LayoutParams.*;
16
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
15
 
17
 
16
 public class ScreenStack extends FrameLayout {
18
 public class ScreenStack extends FrameLayout {
17
 
19
 
42
         }
44
         }
43
         RctView view = new RctView(reactActivity, mReactInstanceManager, screen);
45
         RctView view = new RctView(reactActivity, mReactInstanceManager, screen);
44
         addView(view, MATCH_PARENT, MATCH_PARENT);
46
         addView(view, MATCH_PARENT, MATCH_PARENT);
45
-        if(oldView!=null) {
46
-            oldView.setVisibility(GONE);
47
+        if(oldView != null) {
48
+            ReactRootView reactRootView = ((RctView) oldView).getReactRootView();
49
+            ReflectionUtils.setBooleanField(reactRootView, "mAttachScheduled", true);
50
+            removeView(oldView);
47
         }
51
         }
48
         stack.push(new ScreenView(screen, view));
52
         stack.push(new ScreenView(screen, view));
49
     }
53
     }
54
         }
58
         }
55
         ScreenView popped = stack.pop();
59
         ScreenView popped = stack.pop();
56
         if(!stack.isEmpty()) {
60
         if(!stack.isEmpty()) {
57
-            View view = stack.peek().view;
58
-            if(view.getParent() == null)
59
-                addView(stack.peek().view, 0);
60
-            else {
61
-                view.setVisibility(VISIBLE);
62
-            }
61
+            addView(stack.peek().view, 0);
63
         }
62
         }
64
         removeView(popped.view);
63
         removeView(popped.view);
65
         return popped.screen;
64
         return popped.screen;