Существует огромная ошибка, которую я пытаюсь выяснить в своем последнем проекте с использованием Kotlin.Итак, как работает приложение, так это то, что у него есть Bottom Navigation Activity, и при нажатии на значки в нижнем меню оно заменяет контейнер соответствующим фрагментом.В onCreate действия я создаю экземпляры всех различных фрагментов с помощью функции, определенной в companionObject внутри фрагментов, которая возвращает себя (что-то вроде статического метода фабрики в 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, щелкая по нему.Есть идеи, как решить эту проблему?