Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 恢复片段而不重新创建?_Android_Android Fragments_Fragment_Back Stack - Fatal编程技术网

Android 恢复片段而不重新创建?

Android 恢复片段而不重新创建?,android,android-fragments,fragment,back-stack,Android,Android Fragments,Fragment,Back Stack,我有8个片段和一个活动。根据用户选择,我将用适当的片段替换内容。在这里,我正在将片段添加到后堆栈中。这工作正常。。当点击“后退”按钮时,片段将从后堆栈中逐个显示。。但是这些片段将再次重新加载。。如何在不重新创建的情况下恢复片段 我试过这样做 public <T> void attachFragmentToContentView(int fragmentId) { Fragment fragment = null; switch (frag

我有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();

        }
    }
public void attachFragmentToContentView(int fragmentId){
片段=空;
交换机(碎片ID){
case Constants.ID\u片段\u设备\u主题:
fragment=DeviceThemeFragment.createInstance();
打破
case Constants.ID\u片段\u公司\u信息:
fragment=CorporationInformationFragment.createInstance();
打破
case Constants.ID_FRAGMENT_NEW_提供:
fragment=新的newOfferFragment();
打破
case Constants.ID_片段_成就:
fragment=新公司实现fragment();
打破
case Constants.ID_FRAGMENT_客户:
片段=新客户片段();
打破
case Constants.ID\u片段\u正在进行的\u方案:
fragment=新的OnGoingSchemesFragment();
打破
case Constants.ID\u片段\u跟踪:
fragment=新的TrackingFragment();
打破
case Constants.ID\u片段\u查询\u表格:
片段=新查询片段();
打破
case Constants.ID\u片段\u新闻\u事件:
fragment=新的NewsEventsFragment();
打破
违约:
即将到来();
打破
}
if(片段!=null){
FragmentTransaction FragmentTransaction=fragmentManager
.beginTransaction();
fragmentTransaction.replace(R.id.content,fragment,
valueOf(fragmentId));
//          
fragmentManager.AddonBackbackChangedListener(此);
fragmentTransaction.addToBackStack(String.valueOf(fragmentId));
fragmentTransaction.commit();
}
}
我从后堆栈弹出时遇到问题。如果有人能解决我的问题,我将不胜感激

谢谢, Chaitanya.K

试试这个

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(){}

我认为您可能必须使用attach/detach,但首先,在创建新实例之前,尝试搜索片段的现有实例:

    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();

        }
    }

如果我明白你的意思。这对你有帮助

@Override
public void onBackPressed(){
  if (getSupportFragmentManager().getBackStackEntryCount() == 1){
    finish();
  }
  else {
    super.onBackPressed();
  }
}

试试这个。

这确实不是问题。请考虑在OnSaveStestScript()中保存片段的状态,并基于该状态重新加载它。我试着把每一个片段都保存在一个静态状态。但是,onSavedInstanceState没有调用..你知道吗?请查看上面的链接,但当用户点击back时,我需要往回遍历。所以我必须将片段添加到后堆栈中。对!!!根据用户选择,碎片加载良好。但使用“后退”按钮返回时,这些碎片正在重新加载/重新创建。