首页 > 解决方案 > 发生进程死亡时如何处理片段实例变量

问题描述

我正在关注这篇关于在 BottomNavigationView 中使用片段的 Medium 文章:

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);

在此处输入图像描述

返回一个空的fragmentHome,但是if else 语句将转到else,这意味着fragmentHome 不为空。为什么我会遇到这个问题?

标签: androidbottomnavigationview

解决方案


处理这种情况的安全方法是在尝试自己添加之前尝试通过其唯一标签获取 Fragment。

fragment = supportFragmentManager.findFragmentByTag("someTag");
if(fragment == null) {
    fragment = new MyFragment();
    supportFragmentManager.beginTransaction().add(fragment, R.id.container, "someTag");
} 

推荐阅读