如何在 Android 应用程序中保存特定片段状态

How to save specific fragment state in Android app

我正在开发一个带有抽屉导航的应用程序,我想保存单个片段的状态。如果我从另一个片段切换到这个片段,它会刷新,我必须避免它。必须重新加载其他片段。我能做什么? 这是我的代码:

    @Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    Fragment fragment = null;
    int id = item.getItemId();

    if (id == R.id.nav_places)
    {
        fragment = new Places();
    }
    else if (id == R.id.nav_map)
    {
        fragment = mapFragment; // fragment which I want to keep in memory
    }
    else if (id == R.id.nav_about)
    {
        fragment = new About();
    }

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_container, fragment).commit(); //NULL POINTER
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

此致!

据我了解,您的问题是,一旦您从当前片段 return 到前一个片段,前一个片段的状态是初始的,并且不反映用户如何配置它上次显示的时间对吗?

在这种情况下你可以做的是使用 ViewPager 来显示你的片段并手动刷新片段,从 SharedPreferences 或静态 class 读取数据,像这样:

// This works like onRefresh(), when the user returns to the fragment.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        ... RELOAD VARIABLES AND UPDATE YOUR FRAGMENT INTERFACE ...
    }
}

当然,在此之前,您需要将所有相关数据写入 SharedPreferences 或静态 class。

总的来说,我发现如果我正确设置片段的 onCreateView(),用 SharedPreferences 初始化我的控件,那么我什至不必求助于上述技巧。我还没有找到一种方法来获取片段并自动保存其状态。你需要自己做腿部工作。祝你好运! :)

您创建了一个变量并将 MapFragment 实例分配给它。您只需实例化一次,然后像

这样重用变量
private Fragment mapFragment = new MapFragment();

...
else if (id == R.id.nav_map)
{
    fragment = mapFragment; 
}

这对你有用吗?