在我使用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。有任何解决此问题的想法吗?
答案 0 :(得分:0)
在这种情况下使用活动上下文
fun saveList() {
activity?.let {
val sharedpref: SharedPreferences =
it.getSharedPreferences("sharedPrefs", MODE_PRIVATE)
{ }
}
}