如何在 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;
}
这对你有用吗?
我正在开发一个带有抽屉导航的应用程序,我想保存单个片段的状态。如果我从另一个片段切换到这个片段,它会刷新,我必须避免它。必须重新加载其他片段。我能做什么? 这是我的代码:
@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;
}
这对你有用吗?