Android: Is it better to create a new fragment every time a navigation drawer item is clicked, or load up previously created fragments? -
i implementing standard navigation drawer pattern android, 10 fragments user can navigate drawer. currently, creating new fragment every time different navigation drawer item clicked so:
// when new navigation item @ index clicked fragmenttransaction ft = fragmentmanager.begintransaction(); ft.settransition(fragmenttransaction.transit_fragment_fade); fragment newfragment = null; if (index == 0) fragment = new fragment0(); ... ft.replace(r.id.container, newfragment); ft.commit();
i have been wondering if more efficient following:
// somewhere in oncreate fragment[] fragments = new fragment[n]; fragments[0] = new fragment0(); fragments[1] = new fragment1(); ... // when new navigation item (at index) clicked fragmenttransaction ft = fragmentmanager.begintransaction(); ft.settransition(fragmenttransaction.transit_fragment_fade); ft.replace(r.id.container, fragments[index]); ft.commit();
my main worry of fragments hold significant amount of data (fairly large lists , lots of views). there issue holding these fragments in memory , provide advantage on instantiating new fragments every time (apart faster switches between fragments)? there accepted 'better' solution?
i had similar issue. took approach similar yours, , save load on processor made following tweak every call create instance fragment object: (in context use in selectitem method)
switch (position) { case 0: if (fragmentone == null) fragmentone = new fragmentone(); getsupportfragmentmanager().begintransaction()....... break; case 1: if (fragmenttwo == null) fragmenttwo = new fragmenttwo(); getsupportfragmentmanager()......
fragmentone , fragmenttwo 2 different fragment classes , fragmentone , fragmenttwo objects declared fields in mainactivity
edit:
i add how follow similar approach array holding fragments. instead of creating new fragments in oncreate, when item clicked. in oncreate, send call drawer select fragment want selected default on launch.
//somewhere in oncreate if (savedinstancestate == null) { selectitem(defaultfragment); } else selectitem(selectedfragment); //selectitem method called draweritemclicklistener //in selectitem: when navigation item @ index clicked, listener calls switch (index) { case 0: if (fragments == null) { fragments = new fragment[n]; fragment[0] = new fragment0(); } else if (fragments[0] == null) { fragments[0] = new fragment0(); } break; .... } fragmenttransaction ft = fragmentmanager.begintransaction(); ... ft.replace(r.id.container, fragments[index]); ft.commit();
no need instantiate fragments on oncreate since makes startup slow. create them , when needed , afterwards use same 1 if exists. new fragments created if being loaded first time.