恢复片段而不重新创建?
Posted
技术标签:
【中文标题】恢复片段而不重新创建?【英文标题】:resume the fragment without recreating? 【发布时间】:2014-02-25 10:05:10 【问题描述】:我有 8 个片段和一个活动..根据用户选择,我正在用适当的片段替换内容。在这里,我将片段添加到后台堆栈中。这工作正常..当点击返回按钮时,片段正在从后台堆栈中一一显示..但是这些片段再次重新加载..如何在不重新创建的情况下恢复片段?
我试过这样
public <T> void attachFragmentToContentView(int fragmentId)
Fragment fragment = null;
switch (fragmentId)
case Constants.ID_FRAGMENT_DEVICE_THEME:
fragment = DeviceThemeFragment.createInstance();
break;
case Constants.ID_FRAGMENT_CORPORATION_INFO:
fragment = CorporationInformationFragment.createInstance();
break;
case Constants.ID_FRAGMENT_NEW_OFFERS:
fragment = new NewOffersFragment<T>();
break;
case Constants.ID_FRAGMENT_ACHIEVEMENTS:
fragment = new CompanyAchievementFragment<T>();
break;
case Constants.ID_FRAGMENT_CLIENTELE:
fragment = new ClienteleFragment<T>();
break;
case Constants.ID_FRAGMENT_ONGOING_SCHEMES:
fragment = new OnGoingSchemesFragment<T>();
break;
case Constants.ID_FRAGMENT_TRACKING:
fragment = new TrackingFragment<T>();
break;
case Constants.ID_FRAGMENT_ENQUIRY_FORM:
fragment = new EnquiryFragment<T>();
break;
case Constants.ID_FRAGMENT_NEWS_EVENTS:
fragment = new NewsEventsFragment<T>();
break;
default:
comingSoon();
break;
if (fragment != null)
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction.replace(R.id.content, fragment,
String.valueOf(fragmentId));
//
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.addToBackStack(String.valueOf(fragmentId));
fragmentTransaction.commit();
我在从回栈弹出时遇到问题。如果有人解决我的问题,我将不胜感激
谢谢, 柴坦亚.K
【问题讨论】:
这确实不是问题。只需考虑将片段的状态保存在 onSaveInstanceState() 中并根据此状态重新加载它。 ***.com/questions/6787071/… 我尝试在每个片段中存储 onSavedInstanceState。但是 onSavedInstanceState 没有调用..你知道吗? 见上面的链接和intertech.com/Blog/…和emuneee.com/blog/2013/01/07/saving-fragment-states 【参考方案1】:试试这个..
Fragment fragment = null;
switch (position)
case 0:
fragment = new HomePage();
break;
case 1:
fragment = new SecondPage();
break;
case 2:
fragment = new ThirdPage();
break;
case 3:
fragment = new SettingsPage();
break;
default:
break;
if (fragment != null)
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction().replace(R.id.frame_container, fragment);
transaction.commit();
您应该在所有片段中都有一个构造函数。 至少是这样的。
public HomePage()
【讨论】:
但是当用户点击返回时我需要遍历回来。所以我必须将片段添加到后面的堆栈中。对!!!【参考方案2】:我认为您可能不得不使用附加/分离,但首先,在创建新实例之前尝试搜索片段的现有实例:
Fragment fragment = fragmentManager.findFragmentByTag(String.valueOf(fragmentId));
if (fragment != null)
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction.attach(R.id.content, fragment);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.addToBackStack(String.valueOf(fragmentId));
fragmentTransaction.commit();
else
// contents of your switch statement setting fragment
if (fragment != null)
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction.replace(R.id.content, fragment,
String.valueOf(fragmentId));
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.addToBackStack(String.valueOf(fragmentId));
fragmentTransaction.commit();
【讨论】:
根据用户的选择,片段加载正常。但是当使用后退按钮返回时,这些片段正在重新加载/重新创建。【参考方案3】:如果我明白你的意思。这会对你有所帮助..
@Override
public void onBackPressed()
if (getSupportFragmentManager().getBackStackEntryCount() == 1)
finish();
else
super.onBackPressed();
试试这个。
【讨论】:
以上是关于恢复片段而不重新创建?的主要内容,如果未能解决你的问题,请参考以下文章