react-native-navigation的迁移库

SingleScreenLayout.java 8.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package com.reactnativenavigation.layouts;
  2. import android.support.annotation.Nullable;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.view.View;
  5. import android.widget.RelativeLayout;
  6. import com.facebook.react.bridge.Callback;
  7. import com.reactnativenavigation.NavigationApplication;
  8. import com.reactnativenavigation.events.EventBus;
  9. import com.reactnativenavigation.events.ScreenChangedEvent;
  10. import com.reactnativenavigation.params.ContextualMenuParams;
  11. import com.reactnativenavigation.params.FabParams;
  12. import com.reactnativenavigation.params.ScreenParams;
  13. import com.reactnativenavigation.params.SideMenuParams;
  14. import com.reactnativenavigation.params.SnackbarParams;
  15. import com.reactnativenavigation.params.TitleBarButtonParams;
  16. import com.reactnativenavigation.params.TitleBarLeftButtonParams;
  17. import com.reactnativenavigation.screens.ScreenStack;
  18. import com.reactnativenavigation.views.LeftButtonOnClickListener;
  19. import com.reactnativenavigation.views.SideMenu;
  20. import com.reactnativenavigation.views.SideMenu.Side;
  21. import com.reactnativenavigation.views.SnackbarAndFabContainer;
  22. import java.util.List;
  23. import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
  24. public class SingleScreenLayout extends RelativeLayout implements Layout {
  25. private final AppCompatActivity activity;
  26. protected final ScreenParams screenParams;
  27. private final SideMenuParams leftSideMenuParams;
  28. private final SideMenuParams rightSideMenuParams;
  29. protected ScreenStack stack;
  30. private SnackbarAndFabContainer snackbarAndFabContainer;
  31. protected LeftButtonOnClickListener leftButtonOnClickListener;
  32. private @Nullable SideMenu sideMenu;
  33. public SingleScreenLayout(AppCompatActivity activity, SideMenuParams leftSideMenuParams,
  34. SideMenuParams rightSideMenuParams, ScreenParams screenParams) {
  35. super(activity);
  36. this.activity = activity;
  37. this.screenParams = screenParams;
  38. this.leftSideMenuParams = leftSideMenuParams;
  39. this.rightSideMenuParams = rightSideMenuParams;
  40. createLayout();
  41. }
  42. private void createLayout() {
  43. if (leftSideMenuParams == null && rightSideMenuParams == null) {
  44. createStack(getScreenStackParent());
  45. } else {
  46. sideMenu = createSideMenu();
  47. createStack(getScreenStackParent());
  48. }
  49. createFabAndSnackbarContainer();
  50. sendScreenChangedEventAfterInitialPush();
  51. }
  52. private RelativeLayout getScreenStackParent() {
  53. return sideMenu == null ? this : sideMenu.getContentContainer();
  54. }
  55. private SideMenu createSideMenu() {
  56. SideMenu sideMenu = new SideMenu(getContext(), leftSideMenuParams, rightSideMenuParams);
  57. RelativeLayout.LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
  58. addView(sideMenu, lp);
  59. return sideMenu;
  60. }
  61. private void createStack(RelativeLayout parent) {
  62. if (stack != null) {
  63. stack.destroy();
  64. }
  65. stack = new ScreenStack(activity, parent, screenParams.getNavigatorId(), this);
  66. LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
  67. pushInitialScreen(lp);
  68. }
  69. protected void pushInitialScreen(LayoutParams lp) {
  70. stack.pushInitialScreen(screenParams, lp);
  71. stack.show();
  72. }
  73. private void sendScreenChangedEventAfterInitialPush() {
  74. if (screenParams.topTabParams != null) {
  75. EventBus.instance.post(new ScreenChangedEvent(screenParams.topTabParams.get(0)));
  76. } else {
  77. EventBus.instance.post(new ScreenChangedEvent(screenParams));
  78. }
  79. }
  80. private void createFabAndSnackbarContainer() {
  81. snackbarAndFabContainer = new SnackbarAndFabContainer(getContext());
  82. RelativeLayout.LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
  83. lp.addRule(ALIGN_PARENT_BOTTOM);
  84. snackbarAndFabContainer.setLayoutParams(lp);
  85. getScreenStackParent().addView(snackbarAndFabContainer);
  86. }
  87. @Override
  88. public boolean onBackPressed() {
  89. if (stack.handleBackPressInJs()) {
  90. return true;
  91. }
  92. if (stack.canPop()) {
  93. stack.pop(true);
  94. EventBus.instance.post(new ScreenChangedEvent(stack.peek().getScreenParams()));
  95. return true;
  96. } else {
  97. return false;
  98. }
  99. }
  100. @Override
  101. public void destroy() {
  102. stack.destroy();
  103. snackbarAndFabContainer.destroy();
  104. if (sideMenu != null) {
  105. sideMenu.destroy();
  106. }
  107. }
  108. @Override
  109. public void push(ScreenParams params) {
  110. LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
  111. stack.push(params, lp);
  112. EventBus.instance.post(new ScreenChangedEvent(params));
  113. }
  114. @Override
  115. public void pop(ScreenParams params) {
  116. stack.pop(params.animateScreenTransitions);
  117. EventBus.instance.post(new ScreenChangedEvent(stack.peek().getScreenParams()));
  118. }
  119. @Override
  120. public void popToRoot(ScreenParams params) {
  121. stack.popToRoot(params.animateScreenTransitions);
  122. EventBus.instance.post(new ScreenChangedEvent(stack.peek().getScreenParams()));
  123. }
  124. @Override
  125. public void newStack(ScreenParams params) {
  126. removeView(stack.peek());
  127. stack.destroy();
  128. ScreenStack newStack = new ScreenStack(activity, getScreenStackParent(), params.getNavigatorId(), this);
  129. LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
  130. newStack.pushInitialScreenWithAnimation(params, lp);
  131. stack = newStack;
  132. EventBus.instance.post(new ScreenChangedEvent(params));
  133. }
  134. @Override
  135. public void setTopBarVisible(String screenInstanceID, boolean visible, boolean animate) {
  136. stack.setScreenTopBarVisible(screenInstanceID, visible, animate);
  137. }
  138. @Override
  139. public void setTitleBarTitle(String screenInstanceId, String title) {
  140. stack.setScreenTitleBarTitle(screenInstanceId, title);
  141. }
  142. @Override
  143. public void setTitleBarSubtitle(String screenInstanceId, String subtitle) {
  144. stack.setScreenTitleBarSubtitle(screenInstanceId, subtitle);
  145. }
  146. @Override
  147. public View asView() {
  148. return this;
  149. }
  150. @Override
  151. public void setTitleBarRightButtons(String screenInstanceId, String navigatorEventId,
  152. List<TitleBarButtonParams> titleBarRightButtons) {
  153. stack.setScreenTitleBarRightButtons(screenInstanceId, navigatorEventId, titleBarRightButtons);
  154. }
  155. @Override
  156. public void setTitleBarLeftButton(String screenInstanceId, String navigatorEventId, TitleBarLeftButtonParams titleBarLeftButtonParams) {
  157. stack.setScreenTitleBarLeftButton(screenInstanceId, navigatorEventId, titleBarLeftButtonParams);
  158. }
  159. @Override
  160. public void setFab(String screenInstanceId, String navigatorEventId, FabParams fabParams) {
  161. stack.setFab(screenInstanceId, navigatorEventId, fabParams);
  162. }
  163. @Override
  164. public void toggleSideMenuVisible(boolean animated, Side side) {
  165. if (sideMenu != null) {
  166. sideMenu.toggleVisible(animated, side);
  167. }
  168. }
  169. @Override
  170. public void setSideMenuVisible(boolean animated, boolean visible, Side side) {
  171. if (sideMenu != null) {
  172. sideMenu.setVisible(visible, animated, side);
  173. }
  174. }
  175. @Override
  176. public void showSnackbar(SnackbarParams params) {
  177. final String navigatorEventId = stack.peek().getNavigatorEventId();
  178. snackbarAndFabContainer.showSnackbar(navigatorEventId, params);
  179. }
  180. @Override
  181. public void onModalDismissed() {
  182. EventBus.instance.post(new ScreenChangedEvent(stack.peek().getScreenParams()));
  183. }
  184. @Override
  185. public boolean containsNavigator(String navigatorId) {
  186. return stack.getNavigatorId().equals(navigatorId);
  187. }
  188. @Override
  189. public void showContextualMenu(String screenInstanceId, ContextualMenuParams params, Callback onButtonClicked) {
  190. stack.showContextualMenu(screenInstanceId, params, onButtonClicked);
  191. }
  192. @Override
  193. public void dismissContextualMenu(String screenInstanceId) {
  194. stack.dismissContextualMenu(screenInstanceId);
  195. }
  196. @Override
  197. public boolean onTitleBarBackButtonClick() {
  198. if (leftButtonOnClickListener != null) {
  199. return leftButtonOnClickListener.onTitleBarBackButtonClick();
  200. }
  201. return onBackPressed();
  202. }
  203. @Override
  204. public void onSideMenuButtonClick() {
  205. final String navigatorEventId = stack.peek().getNavigatorEventId();
  206. NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("sideMenu", navigatorEventId);
  207. if (sideMenu != null) {
  208. sideMenu.openDrawer(Side.Left);
  209. }
  210. }
  211. }