Контекст является нулевым во фрагменте перед началом жизненного цикла? - PullRequest
1 голос
/ 24 мая 2019

Существует огромная ошибка, которую я пытаюсь выяснить в своем последнем проекте с использованием 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, щелкая по нему.Есть идеи, как решить эту проблему?

1 Ответ

0 голосов
/ 25 мая 2019

Использовать контекст действия для этих случаев

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

  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...