在导航抽屉中保存片段的状态

时间:2014-08-20 05:08:58

标签: android android-fragments android-asynctask navigation-drawer

我在我的Android应用程序中使用导航抽屉..
每个片段都包含异步任务,从Internet获取数据并显示在自定义列表中。

以下是选择片段的代码:

     private void displayView(int position) {

    // update the main content by replacing fragments

    Fragment fragment = null;

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();
    String TAG=null;
    switch (position) {
    case 0:
        fragment = new HomeFragment();
        TAG=new String("Home");
        break;
    case 1:
        // fragment = new BlogsFragment();
        fragment = new BlogsFragment();
        break;
    case 2:

        // fragment = new NewsFragment();
        fragment = new NewsFragment();
        break;
    case 3:

        fragment = new TransferFragment();
        break;
    case 4:
        fragment = new FixturesFragment();
        break;

    case 5:

        fragment = new FeedFragment();
        break;
    case 6:

        // fragment = new TwitterFragment();
        fragment = new TwitterFragment();
        break;
    case 7:

        // fragment = new FacebookFragment();
        fragment = new FacebookFragment();
        break;
    case 8:

        // fragment = new BookmarkFragment();
        fragment = new BookmarkFragment();
        break;
    default:
        break;
    }
    if (fragment != null) {

        ft.replace(R.id.frame_container, fragment).commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(navMenuTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);

    }

    else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }

}

但是当我在片段之间切换时,异步任务又开始加载数据。
那么如何保存片段状态

我在stackoverflow上尝试了所有可能的解决方案

请帮帮我

2 个答案:

答案 0 :(得分:0)

您只能在配置更改或任何其他条件时保存状态。在你的情况下,每次你加载新的片段,因为它再次恢复其生命周期。 查看this

答案 1 :(得分:0)

我认为您需要为每个访问过的片段缓存/存储服务器响应(异步任务结果)。如果它的JSON你可以将它作为字符串存储在SharedPrefs中,然后从那里取回它。这也假设兑现响应的一些到期时间来刷新它。
既然你做了

ft.replace(R.id.frame_container, fragment).commit();

你完全破坏以前显示的片段。您也可以使用addToBackStack()而不是replace或者使用retainInstance状态。