问题描述
我正在关注这篇有关在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;
当我模拟进程死亡并单击主页导航视图时,第一个日志。d
Log.d(TAG,"onNavigationItemSelected: " + fragmentHome);
返回一个空的fragmentHome,但是if else语句转到else,这意味着fragmentHome不为空。为什么会出现此问题?
解决方法
处理此情况的安全方法是尝试先通过其唯一标签获取Fragment,然后再尝试自行添加。
fragment = supportFragmentManager.findFragmentByTag("someTag");
if(fragment == null) {
fragment = new MyFragment();
supportFragmentManager.beginTransaction().add(fragment,R.id.container,"someTag");
}
,
片段管理器具有putFragment
和getFragment
方法,可用于保存和恢复片段的实例状态。
这使我可以保存我的Fragment实例变量,以便它们在进程终止后不会返回null。