react-native-navigation的迁移库

BottomTabsLayout.java 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package com.reactnativenavigation.layouts;
  2. import android.graphics.Color;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.view.View;
  5. import android.widget.RelativeLayout;
  6. import com.aurelhubert.ahbottomnavigation.AHBottomNavigation;
  7. import com.reactnativenavigation.params.ActivityParams;
  8. import com.reactnativenavigation.params.ScreenParams;
  9. import com.reactnativenavigation.params.TitleBarButtonParams;
  10. import com.reactnativenavigation.params.TitleBarLeftButtonParams;
  11. import com.reactnativenavigation.screens.ScreenStack;
  12. import com.reactnativenavigation.views.BottomTabs;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
  16. import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
  17. public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottomNavigation.OnTabSelectedListener {
  18. private final AppCompatActivity activity;
  19. private ActivityParams params;
  20. private BottomTabs bottomTabs;
  21. private ScreenStack[] screenStacks;
  22. private int currentStackIndex = 0;
  23. public BottomTabsLayout(AppCompatActivity activity, ActivityParams params) {
  24. super(activity);
  25. this.activity = activity;
  26. this.params = params;
  27. screenStacks = new ScreenStack[(params.tabParams.size())];
  28. createLayout();
  29. }
  30. private void createLayout() {
  31. createBottomTabs();
  32. addBottomTabsToScreen();
  33. addInitialScreen();
  34. }
  35. private void createBottomTabs() {
  36. bottomTabs = new BottomTabs(getContext());
  37. setBottomTabsStyle();
  38. bottomTabs.addTabs(params.tabParams, this);
  39. }
  40. private void addBottomTabsToScreen() {
  41. LayoutParams lp = new LayoutParams(MATCH_PARENT, WRAP_CONTENT);
  42. lp.addRule(ALIGN_PARENT_BOTTOM);
  43. addView(bottomTabs, lp);
  44. }
  45. private void addInitialScreen() {
  46. createAndAddScreenStack(0);
  47. }
  48. private void setBottomTabsStyle() {
  49. // bottomTabs.setForceTitlesDisplay(style.getBoolean(TAB_STYLE_INACTIVE_TITLES, DEFAULT_TAB_INACTIVE_TITLES));
  50. bottomTabs.setForceTint(true);
  51. // bottomTabs.setDefaultBackgroundColor(getColor(style, TAB_STYLE_BAR_BG_COLOR, DEFAULT_TAB_BAR_BG_COLOR));
  52. // bottomTabs.setInactiveColor(getColor(style, TAB_STYLE_BUTTON_COLOR, DEFAULT_TAB_BUTTON_COLOR));
  53. // bottomTabs.setAccentColor(getColor(style, TAB_STYLE_SELECTED_COLOR, DEFAULT_TAB_SELECTED_COLOR));
  54. }
  55. @Override
  56. public View asView() {
  57. return this;
  58. }
  59. @Override
  60. public boolean onBackPressed() {
  61. if (getCurrentScreenStack().canPop()) {
  62. getCurrentScreenStack().pop();
  63. return true;
  64. } else {
  65. return false;
  66. }
  67. }
  68. @Override
  69. public void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated) {
  70. for (int i = 0; i < bottomTabs.getItemsCount(); i++) {
  71. screenStacks[i].setTopBarVisible(screenInstanceId, hidden, animated);
  72. }
  73. }
  74. @Override
  75. public void setTitleBarTitle(String screenInstanceId, String title) {
  76. for (int i = 0; i < bottomTabs.getItemsCount(); i++) {
  77. screenStacks[i].setTitleBarTitle(screenInstanceId, title);
  78. }
  79. }
  80. @Override
  81. public void setTitleBarRightButtons(String screenInstanceId, String navigatorEventId, List<TitleBarButtonParams> titleBarButtons) {
  82. for (int i = 0; i < bottomTabs.getItemsCount(); i++) {
  83. screenStacks[i].setTitleBarRightButtons(screenInstanceId, navigatorEventId, titleBarButtons);
  84. }
  85. }
  86. @Override
  87. public void setTitleBarLeftButton(String screenInstanceId, String navigatorEventId, TitleBarLeftButtonParams titleBarLeftButtonParams) {
  88. for (int i = 0; i < bottomTabs.getItemsCount(); i++) {
  89. screenStacks[i].setTitleBarLeftButton(screenInstanceId, navigatorEventId, titleBarLeftButtonParams);
  90. }
  91. }
  92. @Override
  93. public void push(ScreenParams screenParams) {
  94. getCurrentScreenStack().push(screenParams);
  95. }
  96. @Override
  97. public void pop(ScreenParams screenParams) {
  98. getCurrentScreenStack().pop();
  99. }
  100. @Override
  101. public void popToRoot(ScreenParams params) {
  102. getCurrentScreenStack().popToRoot();
  103. }
  104. @Override
  105. public void newStack(ScreenParams params) {
  106. ScreenStack currentScreenStack = getCurrentScreenStack();
  107. currentScreenStack.destroy();
  108. removeView(currentScreenStack);
  109. ScreenStack newStack = new ScreenStack(getContext(), params);
  110. screenStacks[currentStackIndex] = newStack;
  111. addView(newStack, 0, new RelativeLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT));
  112. }
  113. @Override
  114. public void destroy() {
  115. for (ScreenStack screenStack : screenStacks) {
  116. screenStack.destroy();
  117. removeView(screenStack);
  118. }
  119. screenStacks = null;
  120. }
  121. @Override
  122. public void onTabSelected(int position, boolean wasSelected) {
  123. removeCurrentStack();
  124. ScreenStack newStack = screenStacks[position];
  125. if (newStack == null) {
  126. createAndAddScreenStack(position);
  127. } else {
  128. addView(newStack, 0, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
  129. newStack.preventMountAfterReatachedToWindow();
  130. }
  131. currentStackIndex = position;
  132. }
  133. private void createAndAddScreenStack(int position) {
  134. ScreenStack newStack = new ScreenStack(getContext(), params.tabParams.get(position));
  135. screenStacks[position] = newStack;
  136. addView(newStack, 0, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
  137. }
  138. private void removeCurrentStack() {
  139. ScreenStack currentScreenStack = getCurrentScreenStack();
  140. currentScreenStack.preventUnmountOnDetachedFromWindow();
  141. removeView(currentScreenStack);
  142. }
  143. private ScreenStack getCurrentScreenStack() {
  144. return screenStacks[currentStackIndex];
  145. }
  146. }