3030import static com .ashokvarma .bottomnavigation .BottomNavigationBar .OnTabSelectedListener ;
3131
3232public class MainActivity extends BackStackActivity implements OnTabSelectedListener {
33- private static final String STATE_TAB_ID = "tab_id " ;
33+ private static final String STATE_CURRENT_TAB_ID = "current_tab_id " ;
3434 private static final int MAIN_TAB_ID = 0 ;
3535
36- private BottomNavigationBar bottomNavigationBar ;
36+ private BottomNavigationBar bottomNavBar ;
3737 private Fragment curFragment ;
3838 private int curTabId ;
3939
4040 @ Override
4141 protected void onCreate (Bundle state ) {
4242 super .onCreate (state );
4343 setContentView (R .layout .activity_main );
44- setUpBottomNavigationBar ();
44+ setUpBottomNavBar ();
45+
46+ if (state == null ) {
47+ bottomNavBar .selectTab (MAIN_TAB_ID , false );
48+ showFragment (rootTabFragment (MAIN_TAB_ID ));
49+ }
4550 }
4651
47- private void setUpBottomNavigationBar () {
48- bottomNavigationBar = (BottomNavigationBar ) findViewById (R .id .bottom_navigation );
49- bottomNavigationBar
52+ private void setUpBottomNavBar () {
53+ bottomNavBar = (BottomNavigationBar ) findViewById (R .id .bottom_navigation );
54+ bottomNavBar
5055 .addItem (new BottomNavigationItem (R .drawable .ic_search_24dp , R .string .search ))
51- .addItem (new BottomNavigationItem (R .drawable .ic_favorite_24dp , R .string .favorite ))
56+ .addItem (new BottomNavigationItem (R .drawable .ic_favorite_24dp , R .string .favorites ))
5257 .addItem (new BottomNavigationItem (R .drawable .ic_profile_24dp , R .string .profile ))
5358 .initialise ();
59+ bottomNavBar .setTabSelectedListener (this );
60+ }
5461
55- bottomNavigationBar .setTabSelectedListener (this );
56- if (getSupportFragmentManager ().findFragmentById (R .id .content ) == null ) {
57- bottomNavigationBar .selectTab (MAIN_TAB_ID , false );
58- showFragment (fragmentByTab (MAIN_TAB_ID ));
62+ @ NonNull
63+ private Fragment rootTabFragment (int tabId ) {
64+ switch (tabId ) {
65+ case 0 :
66+ return ItemListFragment .newInstance (getString (R .string .search ));
67+ case 1 :
68+ return ItemListFragment .newInstance (getString (R .string .favorites ));
69+ case 2 :
70+ return ItemListFragment .newInstance (getString (R .string .profile ));
71+ default :
72+ throw new IllegalArgumentException ();
5973 }
6074 }
6175
6276 @ Override
6377 protected void onRestoreInstanceState (Bundle savedInstanceState ) {
6478 super .onRestoreInstanceState (savedInstanceState );
6579 curFragment = getSupportFragmentManager ().findFragmentById (R .id .content );
66- curTabId = savedInstanceState .getInt (STATE_TAB_ID );
67- bottomNavigationBar .selectTab (curTabId , false );
80+ curTabId = savedInstanceState .getInt (STATE_CURRENT_TAB_ID );
81+ bottomNavBar .selectTab (curTabId , false );
6882 }
6983
7084 @ Override
7185 protected void onSaveInstanceState (Bundle outState ) {
72- outState .putInt (STATE_TAB_ID , curTabId );
86+ outState .putInt (STATE_CURRENT_TAB_ID , curTabId );
7387 super .onSaveInstanceState (outState );
7488 }
7589
76- @ SuppressWarnings ("ConstantConditions" )
7790 @ Override
7891 public void onBackPressed () {
79- if (! backStackManager . empty ()) {
80- Pair < Integer , Fragment > pair = popFromBackStack ();
92+ Pair < Integer , Fragment > pair = popFragmentFromBackStack ();
93+ if ( pair != null ) {
8194 backTo (pair .first , pair .second );
8295 } else {
8396 super .onBackPressed ();
@@ -87,14 +100,14 @@ public void onBackPressed() {
87100 @ Override
88101 public void onTabSelected (int position ) {
89102 if (curFragment != null ) {
90- pushToBackStack (curTabId , curFragment );
103+ pushFragmentToBackStack (curTabId , curFragment );
91104 }
92105 curTabId = position ;
93- curFragment = popFromBackStack (curTabId );
94- if (curFragment == null ) {
95- curFragment = fragmentByTab (curTabId );
106+ Fragment fragment = popFragmentFromBackStack (curTabId );
107+ if (fragment == null ) {
108+ fragment = rootTabFragment (curTabId );
96109 }
97- replaceFragment (curFragment );
110+ replaceFragment (fragment );
98111 }
99112
100113 @ Override
@@ -105,55 +118,45 @@ public void onTabReselected(int position) {
105118 @ Override
106119 public void onTabUnselected (int position ) {}
107120
108- private Fragment fragmentByTab (int tabId ) {
109- switch (tabId ) {
110- case 0 :
111- return ItemListFragment .newInstance (getString (R .string .search ));
112- case 1 :
113- return ItemListFragment .newInstance (getString (R .string .favorite ));
114- case 2 :
115- return ItemListFragment .newInstance (getString (R .string .profile ));
116- default :
117- throw new IllegalArgumentException ();
118- }
119- }
120-
121121 public void showFragment (@ NonNull Fragment fragment ) {
122122 showFragment (fragment , true );
123123 }
124124
125125 public void showFragment (@ NonNull Fragment fragment , boolean addToBackStack ) {
126126 if (curFragment != null && addToBackStack ) {
127- pushToBackStack (curTabId , curFragment );
127+ pushFragmentToBackStack (curTabId , curFragment );
128128 }
129- curFragment = fragment ;
130129 replaceFragment (fragment );
131130 }
132131
133132 private void backTo (int tabId , @ NonNull Fragment fragment ) {
134- curTabId = tabId ;
135- bottomNavigationBar .selectTab (curTabId , false );
136- curFragment = fragment ;
133+ if (tabId != curTabId ) {
134+ curTabId = tabId ;
135+ bottomNavBar .selectTab (curTabId , false );
136+ }
137137 replaceFragment (fragment );
138138 getSupportFragmentManager ().executePendingTransactions ();
139139 }
140140
141141 private void backToRoot () {
142- Fragment originalRootFragment = fragmentByTab (curTabId );
143- if (curFragment .getClass () != originalRootFragment .getClass ()) {
144- Fragment rootFragment = popRootFromBackStack (curTabId );
145- if (rootFragment == null || rootFragment .getClass () != originalRootFragment .getClass ()) {
146- rootFragment = originalRootFragment ;
147- }
148- curFragment = rootFragment ;
149- replaceFragment (rootFragment );
142+ if (isRootTabFragment (curFragment , curTabId )) {
143+ return ;
150144 }
145+ resetBackStackToRoot (curTabId );
146+ Fragment rootFragment = popFragmentFromBackStack (curTabId );
147+ assert rootFragment != null ;
148+ backTo (curTabId , rootFragment );
149+ }
150+
151+ private boolean isRootTabFragment (@ NonNull Fragment fragment , int tabId ) {
152+ return fragment .getClass () == rootTabFragment (tabId ).getClass ();
151153 }
152154
153155 private void replaceFragment (@ NonNull Fragment fragment ) {
154156 FragmentManager fm = getSupportFragmentManager ();
155157 FragmentTransaction tr = fm .beginTransaction ();
156158 tr .replace (R .id .content , fragment );
157- tr .commit ();
159+ tr .commitAllowingStateLoss ();
160+ curFragment = fragment ;
158161 }
159162}
0 commit comments