生命周期开始前片段中的上下文为空吗?

时间:2019-05-24 13:07:56

标签: kotlin fragment android-context

在我使用Kotlin的最新项目中,我试图找出一个巨大的错误。因此,该应用程序的工作方式是它具有“底部导航活动”,然后单击“底部”菜单上的图标,即可将容器替换为受关注的片段。在活动的onCreate上,我使用片段中的partnerObject中定义的函数实例化所有不同的片段,该函数返回自身(有点像Java中的静态工厂方法):

override fun onCreate(savedInstanceState: Bundle?) {
        {...}

        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

        fragment1 = Fragment1.newInstance()
        fragment2 = Fragment2.newInstance()
}

然后单击该按钮,将容器替换为受尊重的片段:

private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.f1 -> {
                replaceFragment(fragment1)
                return@OnNavigationItemSelectedListener true
            }
            R.id.f2 -> {
                replaceFragment(fragment2)
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }
{...}
fun replaceFragment(destFragment: Fragment) {
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.container, destFragment)
            .addToBackStack(destFragment.toString())
            .commit()
    }

片段正在通信。如果您要在两个片段上单击,从而导致它们的生命周期执行,则代码可以正常工作。但是,如果您对frag1进行了更改,在片段之间调用了通信,而没有事先单击frag2,则应用程序将崩溃。原因是frag2中的这一行:

fun saveList(){
        val sharedpref : SharedPreferences = context!!.getSharedPreferences("sharedPrefs", MODE_PRIVATE)
        {...}
    }

如果用户从未通过单击来调用frag2生命周期,则上下文为null。有任何解决此问题的想法吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下使用活动上下文

fun saveList() {
  activity?.let {
    val sharedpref: SharedPreferences =
      it.getSharedPreferences("sharedPrefs", MODE_PRIVATE)
      {  }

  }
}