Daniel Zlotin 8 years ago
parent
commit
a109e51b45

+ 4
- 3
android/app/src/main/java/com/reactnativenavigation/layouts/Screen.java View File

1
 package com.reactnativenavigation.layouts;
1
 package com.reactnativenavigation.layouts;
2
 
2
 
3
-/**
4
- * Must extend View
5
- */
3
+import android.view.View;
4
+
6
 public interface Screen {
5
 public interface Screen {
6
+    View asView();
7
+
7
     void ensureUnmountOnDetachedFromWindow();
8
     void ensureUnmountOnDetachedFromWindow();
8
 }
9
 }

+ 6
- 0
android/app/src/main/java/com/reactnativenavigation/layouts/ScreenImpl.java View File

5
 import android.content.Context;
5
 import android.content.Context;
6
 import android.graphics.Color;
6
 import android.graphics.Color;
7
 import android.os.Build;
7
 import android.os.Build;
8
+import android.view.View;
8
 import android.view.Window;
9
 import android.view.Window;
9
 import android.widget.LinearLayout;
10
 import android.widget.LinearLayout;
10
 
11
 
104
         // TODO handle if needed
105
         // TODO handle if needed
105
     }
106
     }
106
 
107
 
108
+    @Override
109
+    public View asView() {
110
+        return this;
111
+    }
112
+
107
     @Override
113
     @Override
108
     public void ensureUnmountOnDetachedFromWindow() {
114
     public void ensureUnmountOnDetachedFromWindow() {
109
         contentView.ensureUnmountOnDetachedFromWindow();
115
         contentView.ensureUnmountOnDetachedFromWindow();

+ 2
- 3
android/app/src/main/java/com/reactnativenavigation/layouts/ScreenStack.java View File

2
 
2
 
3
 import android.animation.LayoutTransition;
3
 import android.animation.LayoutTransition;
4
 import android.content.Context;
4
 import android.content.Context;
5
-import android.view.View;
6
 import android.widget.FrameLayout;
5
 import android.widget.FrameLayout;
7
 
6
 
8
 import com.reactnativenavigation.params.ScreenParams;
7
 import com.reactnativenavigation.params.ScreenParams;
23
 
22
 
24
     public void push(ScreenParams screenParams) {
23
     public void push(ScreenParams screenParams) {
25
         Screen screen = new ScreenImpl(getContext(), screenParams);
24
         Screen screen = new ScreenImpl(getContext(), screenParams);
26
-        addView((View) screen, new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT));
25
+        addView(screen.asView(), new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT));
27
         stack.push(screen);
26
         stack.push(screen);
28
     }
27
     }
29
 
28
 
30
     public Screen pop() {
29
     public Screen pop() {
31
         Screen popped = stack.pop();
30
         Screen popped = stack.pop();
32
         popped.ensureUnmountOnDetachedFromWindow();
31
         popped.ensureUnmountOnDetachedFromWindow();
33
-        removeView((View) popped);
32
+        removeView(popped.asView());
34
         return popped;
33
         return popped;
35
     }
34
     }
36
 
35
 

+ 2
- 1
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreenLayout.java View File

21
     private void createStack(Context context) {
21
     private void createStack(Context context) {
22
         if (stack != null) {
22
         if (stack != null) {
23
             stack.destroy();
23
             stack.destroy();
24
+            removeView(stack);
24
         }
25
         }
25
         stack = new ScreenStack(context, screenParams);
26
         stack = new ScreenStack(context, screenParams);
26
         addView(stack, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
27
         addView(stack, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
63
 
64
 
64
     @Override
65
     @Override
65
     public void newStack(ScreenParams params) {
66
     public void newStack(ScreenParams params) {
66
-        stack.destroy();
67
+        createStack(getContext());
67
     }
68
     }
68
 }
69
 }

+ 23
- 0
example-redux/src/screens/PushedScreen.js View File

83
           <Text style={styles.button}>Pop to root</Text>
83
           <Text style={styles.button}>Pop to root</Text>
84
         </TouchableOpacity>
84
         </TouchableOpacity>
85
 
85
 
86
+        <TouchableOpacity onPress={ this.onNewStackPress.bind(this) }>
87
+          <Text style={styles.button}>New Stack</Text>
88
+        </TouchableOpacity>
89
+
86
         <TextInput style={{height: 40, borderColor: 'gray', borderWidth: 1}}/>
90
         <TextInput style={{height: 40, borderColor: 'gray', borderWidth: 1}}/>
87
 
91
 
88
         <Text style={{fontWeight: '500'}}>String prop: {this.props.str}</Text>
92
         <Text style={{fontWeight: '500'}}>String prop: {this.props.str}</Text>
151
   onPopToRootPress() {
155
   onPopToRootPress() {
152
     this.props.navigator.popToRoot();
156
     this.props.navigator.popToRoot();
153
   }
157
   }
158
+
159
+  onNewStackPress() {
160
+    this.props.navigator.resetTo({
161
+      title: "NEW STACK",
162
+      screen: "example.PushedScreen",
163
+      passProps: {
164
+        passed: 'This is a prop passed in \'navigator.push()\'!',
165
+        obj: {
166
+          str: 'This is a prop passed in an object!',
167
+          arr: [
168
+            {
169
+              str: 'This is a prop in an object in an array in an object!'
170
+            }
171
+          ]
172
+        },
173
+        num: 1234
174
+      }
175
+    });
176
+  }
154
 }
177
 }
155
 
178
 
156
 const styles = StyleSheet.create({
179
 const styles = StyleSheet.create({

+ 12
- 7
src/deprecated/platformSpecificDeprecated.android.js View File

64
   newPlatformSpecific.popToRoot(adapted);
64
   newPlatformSpecific.popToRoot(adapted);
65
 }
65
 }
66
 
66
 
67
+function navigatorResetTo(navigator, params) {
68
+  addNavigatorParams(params, navigator);
69
+  addNavigatorButtons(params);
70
+  addNavigationStyleParams(params);
71
+
72
+  params.screenId = params.screen;
73
+  let adapted = adaptNavigationStyleToScreenStyle(params);
74
+  adapted = adaptNavigationParams(adapted);
75
+
76
+  newPlatformSpecific.newStack(adapted);
77
+}
78
+
67
 function adaptNavigationStyleToScreenStyle(screen) {
79
 function adaptNavigationStyleToScreenStyle(screen) {
68
   const navigatorStyle = screen.navigatorStyle;
80
   const navigatorStyle = screen.navigatorStyle;
69
   if (!navigatorStyle) {
81
   if (!navigatorStyle) {
138
   //RctActivity.setNavigatorButtons(params);
150
   //RctActivity.setNavigatorButtons(params);
139
 }
151
 }
140
 
152
 
141
-function navigatorResetTo(navigator, params) {
142
-  //addNavigatorParams(params, navigator);
143
-  //addNavigatorButtons(params);
144
-  //addNavigationStyleParams(params);
145
-  //RctActivity.navigatorResetTo(params);
146
-}
147
-
148
 function navigatorSetTabBadge(navigator, params) {
153
 function navigatorSetTabBadge(navigator, params) {
149
   //RctActivity.setTabBadge({
154
   //RctActivity.setTabBadge({
150
   //  tabIndex: params.tabIndex,
155
   //  tabIndex: params.tabIndex,

+ 6
- 1
src/platformSpecific.android.js View File

28
   NativeModules.NavigationReactModule.popToRoot(screenParams);
28
   NativeModules.NavigationReactModule.popToRoot(screenParams);
29
 }
29
 }
30
 
30
 
31
+function newStack(screenParams) {
32
+  NativeModules.NavigationReactModule.newStack(screenParams);
33
+}
34
+
31
 module.exports = {
35
 module.exports = {
32
   startApp,
36
   startApp,
33
   push,
37
   push,
34
   pop,
38
   pop,
35
-  popToRoot
39
+  popToRoot,
40
+  newStack
36
 };
41
 };