Kotlin View Binding становится нулевым вне методов жизненного цикла при возврате из фрагментаAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Kotlin View Binding становится нулевым вне методов жизненного цикла при возврате из фрагмента

Сообщение Anonymous »

У меня есть приложение, состоящее из одного MainActivity и нескольких фрагментов, с которыми взаимодействуют некоторые ImageButtons в этом действии. В одном фрагменте(UnreviewedFragment), у меня есть RecyclerView, адаптер которого можно изменить для отображения различной информации. Это прекрасно работает при первой загрузке этого фрагмента.
Однако, когда я вхожу в EditFragment, используя следующий код в MainActivity.kt:
addButton.setOnClickListener {
supportFragmentManager.commit {
replace(R.id.fragmentContainerView, "edit")
}
reviewedButton.isEnabled = true
unreviewedButton.isEnabled = true
}

А затем вернитесь к любому представлению с помощью следующего кода:
unreviewedButton.setOnClickListener {
Log.d("MainActivity", "Unreviewed Button pressed! Is it enabled: ${unreviewedButton.isEnabled}")
if (supportFragmentManager.findFragmentByTag("edit") != null) {
supportFragmentManager.commit {
replace(R.id.fragmentContainerView, "restaurants")
}
}
supportFragmentManager.executePendingTransactions()

restaurantsFragment.setModeUnreviewed()
unreviewedButton.isEnabled = false
reviewedButton.isEnabled = true
}

reviewedButton.setOnClickListener {
Log.d("MainActivity", "Reviewed Button pressed! Is it enabled: ${reviewedButton.isEnabled}")
if (supportFragmentManager.findFragmentByTag("edit") != null) {
supportFragmentManager.commit {
replace(R.id.fragmentContainerView, "restaurants")
}
}
supportFragmentManager.executePendingTransactions()
restaurantsFragment.setModeReviewed()
unreviewedButton.isEnabled = true
reviewedButton.isEnabled = false
}

Привязка, используемая в методах setModeReviewed и setModeUnreviewed в UnreviewedFragment, внезапно становится нулевой.
Мои операторы ведения журнала и некоторая отладка показывают, что после вызова replace привязки все еще имеют значения в onViewCreated, но, похоже, они теряют эти значения и становятся нулевыми при транзакции завершается, и в onClickListener кнопки вызывается RestaurantFragment.setModeReviewed().
Функция onCreateView моего фрагмента выглядит следующим образом:
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
Log.d("UnreviewedFragment", "onCreateView")
// set view bindings
// TODO try resetting with simple findviewbyid to see if binding null exception leaves
_binding = FragmentUnreviewedBinding.inflate(layoutInflater)

Log.d("UnreviewedFragment", "binding is: $_binding")
Log.d("UnreviewedFragment", "Inflated! Viewmodel: $viewModel")

reviewedAdapter = ReviewedItemAdapter()
unReviewedAdapter = UnreviewedItemAdapter()
binding.unreviewedRecyclerView.adapter = unReviewedAdapter
binding.unreviewedRecyclerView.layoutManager = LinearLayoutManager(activity?.applicationContext!!)

viewModel.restaurantList.observe(viewLifecycleOwner, Observer { restaurants ->
restaurants?.let { unReviewedAdapter.setRestaurants(it) }
restaurants?.let { reviewedAdapter.setRestaurants(it) }
})
val view = binding.root
return view
}

А код выхода из EditItemFragment выглядит следующим образом:
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
_binding = FragmentEditItemBinding.inflate(layoutInflater)

// set up listeners
binding.submitButton.setOnClickListener {
viewModel.insert(Restaurant(
binding.restaurantNameEdit.text.toString(),
binding.restaurantAddressEdit.text.toString(),
binding.restaurantWebsiteEdit.text.toString(),
"dragon_hotpot_outside", // TODO fix this later
binding.priceBar.rating.toInt(),
null,
Date(),
null
))
}
val view: View = binding.root
return view
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... rning-from
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»