发生进程死亡时如何处理片段实例变量

问题描述

我正在关注这篇有关在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);

enter image description here

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

解决方法

处理此情况的安全方法是尝试先通过其唯一标签获取Fragment,然后再尝试自行添加。

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

片段管理器具有putFragmentgetFragment方法,可用于保存和恢复片段的实例状态。

这使我可以保存我的Fragment实例变量,以便它们在进程终止后不会返回null。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...