【问题标题】: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

【问题讨论】:

标签: android android-fragments fragment back-stack


【解决方案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();
  }
}

试试这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2019-12-07
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多