在Activity中使用导航抽屉并通过这些代码行更改碎片
switch (menuItem.getItemId()) {
case R.id.home:
menuItem.setChecked(true);
drawerLayout.closeDrawer(GravityCompat.START);
if (getSupportFragmentManager().findFragmentByTag("ranking") == null) {
getSupportFragmentManager()
.beginTransaction()
.add(R.id.list_view_container, new HomeFragment(),
"ranking")
.addToBackStack("ranking")
.setTransition(
FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit();
} else {
getSupportFragmentManager().popBackStack("ranking", 0);
}
return true;
case R.id.current_event:
menuItem.setChecked(true);
drawerLayout.closeDrawer(GravityCompat.START);
if (getSupportFragmentManager().findFragmentByTag("ranking1") == null) {
getSupportFragmentManager()
.beginTransaction()
.add(R.id.list_view_container, new CurrentEvents(),
"ranking1")
.addToBackStack("ranking1")
.setTransition(
FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit();
} else {
getSupportFragmentManager().popBackStack("ranking1", 1);
}
return true;
}
我希望片段保留在内存中,以便它不会一次又一次地重建并一次又一次地从互联网上获取数据所以我已经使用上述方法来获取它但是现在,当我通过导航抽屉改变片段时片段正在替换另一个并继续,我还必须按回按钮=创建新片段以退出应用程序的次数。我想在Backstack中使用片段,但不喜欢这种相互替换的片段。我只想要一种方法。请帮忙
答案 0 :(得分:0)
由于您使用的是add()
,因此不会从容器中删除之前的Fragment
。
您应该将add()
的来电替换为replace()
。例如,case R.id.home
将成为:
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.list_view_container, new HomeFragment(),
"ranking")
.addToBackStack("ranking")
.setTransition(
FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit();
我希望Fragment保留在内存中,以便它不会一次又一次地重建并一次又一次地从互联网上获取数据
您可以尝试使用Fragment
setRetainInstance(true)
来做到这一点,但不推荐(我从未使用过它)。
另一种更合适的方法是使用Fragment
' s onSaveInstanceState()
。您可以在Developer Android了解相关信息。
答案 1 :(得分:0)
您可以检查此方案,希望它能解决您的问题: -
尝试从FragmentTransaction附加和分离片段。什么时候 你移动到下一个片段分离最后一个片段 FragmentTransaction以及当您想再次使用它时,请附加它。
请参阅示例代码,了解如何分离和附加片段,它会 帮助你:
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
AndroidFragment androidFragment = (AndroidFragment) fm.findFragmentByTag("android");
AppleFragment appleFragment = (AppleFragment) fm.findFragmentByTag("apple");
android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
/** Detaches the androidfragment if exists */
if(androidFragment!=null)
ft.detach(androidFragment);
/** Detaches the applefragment if exists */
if(appleFragment!=null)
ft.detach(appleFragment);
/** If current tab is android */
if(tabId.equalsIgnoreCase("android")){
if(androidFragment==null){
/** Create AndroidFragment and adding to fragmenttransaction */
ft.add(R.id.realtabcontent,new AndroidFragment(), "android");
}else{
/** Bring to the front, if already exists in the fragmenttransaction */
ft.attach(androidFragment);
}
}else{ /** If current tab is apple */
if(appleFragment==null){
/** Create AppleFragment and adding to fragmenttransaction */
ft.add(R.id.realtabcontent,new AppleFragment(), "apple");
}else{
/** Bring to the front, if already exists in the fragmenttransaction */
ft.attach(appleFragment);
}
}
ft.commit();
`For Reference see this onTabChanged :` [http://wptrafficanalyzer.in/blog/creating-navigation-tabs-using-tabhost-and-fragments-in-android/][1]