react-native-navigation的迁移库

SingleScreenLayout.java 8.4KB

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