进程死亡时如何处理Fragment Instance Variables
How to deal with Fragment Instance Variables when process death occurs
我正在关注这篇关于将片段与 BottomNavigationView 结合使用的中篇文章:
https://medium.com/@oluwabukunmi.aluko/bottom-navigation-view-with-fragments-a074bfd08711
但是作者并没有深入探讨当Process Death发生时如何处理。我应该如何处理所有片段实例变量?因为我在进程终止后返回到应用程序时得到空指针。
public class MainActivity extends AppCompatActivity{
private Fragment currentBottomNavFragment;
private FragmentHome fragmentHome;
private FragmentSearch fragmentSearch;
private FragmentProfile fragmentProfile;
}
编辑1:______________________________
case R.id.bottomnav_home:
Log.d(TAG, "onNavigationItemSelected: " + fragmentHome);
fragmentHome = (FragmentHome) getSupportFragmentManager()
.findFragmentByTag("FRAGMENT_HOME");
if (fragmentHome == null) {
fragmentHome = new FragmentHome();
getSupportFragmentManager().beginTransaction()
.add(R.id.main_fragment_container, fragmentHome, "FRAGMENT_HOME")
.commit();
}else {
Log.d(TAG, "onNavigationItemSelected: Fragment home not null");
Log.d(TAG, "onNavigationItemSelected: " + fragmentHome);
}
return true;
当我模拟进程死亡点击首页导航视图时,第一个log.d
Log.d(TAG, "onNavigationItemSelected: " + fragmentHome);
returns 一个空的 fragmentHome,但是 if else 语句转到 else 意味着 fragmentHome 不为空。为什么我会遇到这个问题?
处理这种情况的安全方法是尝试通过其唯一标记获取片段,然后再尝试自己添加它。
fragment = supportFragmentManager.findFragmentByTag("someTag");
if(fragment == null) {
fragment = new MyFragment();
supportFragmentManager.beginTransaction().add(fragment, R.id.container, "someTag");
}
片段管理器有一个 putFragment
和 getFragment
方法,您可以使用它来保存和恢复片段的实例状态。
这让我可以保存我的片段实例变量,这样它们在进程死亡后不会 return null。
我正在关注这篇关于将片段与 BottomNavigationView 结合使用的中篇文章:
https://medium.com/@oluwabukunmi.aluko/bottom-navigation-view-with-fragments-a074bfd08711
但是作者并没有深入探讨当Process Death发生时如何处理。我应该如何处理所有片段实例变量?因为我在进程终止后返回到应用程序时得到空指针。
public class MainActivity extends AppCompatActivity{
private Fragment currentBottomNavFragment;
private FragmentHome fragmentHome;
private FragmentSearch fragmentSearch;
private FragmentProfile fragmentProfile;
}
编辑1:______________________________
case R.id.bottomnav_home:
Log.d(TAG, "onNavigationItemSelected: " + fragmentHome);
fragmentHome = (FragmentHome) getSupportFragmentManager()
.findFragmentByTag("FRAGMENT_HOME");
if (fragmentHome == null) {
fragmentHome = new FragmentHome();
getSupportFragmentManager().beginTransaction()
.add(R.id.main_fragment_container, fragmentHome, "FRAGMENT_HOME")
.commit();
}else {
Log.d(TAG, "onNavigationItemSelected: Fragment home not null");
Log.d(TAG, "onNavigationItemSelected: " + fragmentHome);
}
return true;
当我模拟进程死亡点击首页导航视图时,第一个log.d
Log.d(TAG, "onNavigationItemSelected: " + fragmentHome);
returns 一个空的 fragmentHome,但是 if else 语句转到 else 意味着 fragmentHome 不为空。为什么我会遇到这个问题?
处理这种情况的安全方法是尝试通过其唯一标记获取片段,然后再尝试自己添加它。
fragment = supportFragmentManager.findFragmentByTag("someTag");
if(fragment == null) {
fragment = new MyFragment();
supportFragmentManager.beginTransaction().add(fragment, R.id.container, "someTag");
}
片段管理器有一个 putFragment
和 getFragment
方法,您可以使用它来保存和恢复片段的实例状态。
这让我可以保存我的片段实例变量,这样它们在进程死亡后不会 return null。