Я создаю прослушиватель кликов во фрагменте.Этот слушатель устанавливает значение liveata в модели представления.Я наблюдаю это значение, и когда оно меняется, я помещаю его значение в пакет и передаю его в транзакции фрагмента следующему фрагменту.
Это все работает.Но когда я возвращаюсь к этому фрагменту (с помощью кнопки «назад»), наблюдатель вызывается снова, и он уходит.
Я попытался: - удалить наблюдателя .. используя функцию расширения, как показано в этом постеhttps://code.luasoftware.com/tutorials/android/android-livedata-observe-once-only-kotlin/
- установка для модели представления и слушателя значения NULL после закрытия наблюдателя
- попытка сброса значения строки жилы
Настройка слушателя:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val backpackImage = view?.findViewById(R.id.image_backpack) as ImageView
val poloImage = view?.findViewById(R.id.polo_image) as ImageView
val pantsImage = view?.findViewById(R.id.pants_image) as ImageView
val socksImage = view?.findViewById(R.id.socks_image) as ImageView
val sweatshirtImage = view?.findViewById(R.id.sweatshirt_image) as ImageView
categoryOfImageClickListner = View.OnClickListener {
view->
when(view.id){
R.id.image_backpack -> viewModel?.setCategory(Categories.BACKPACKS.storeCategories)
R.id.polo_image ->viewModel?.setCategory(Categories.POLOS.storeCategories)
R.id.pants_image ->viewModel?.setCategory(Categories.PANTS.storeCategories)
R.id.socks_image ->viewModel?.setCategory(Categories.SOCKS.storeCategories)
R.id.sweatshirt_image ->viewModel?.setCategory(Categories.SWEATSHIRTS.storeCategories)
}
}
backpackImage.setOnClickListener(categoryOfImageClickListner)
socksImage.setOnClickListener(categoryOfImageClickListner)
pantsImage.setOnClickListener(categoryOfImageClickListner)
poloImage.setOnClickListener(categoryOfImageClickListner)
sweatshirtImage.setOnClickListener(categoryOfImageClickListner)
}
---------------------
Наблюдатель:
override fun onActivityCreated(savedInstanceState: Bundle?) {
...
...
var categoryObservable :LiveData<String> = viewModel?.getCategoryForNavigation()!!
categoryObservable.observeOnce(viewLifecycleOwner, Observer {
categoryObservable.removeObservers(this)
it.let {
var args = Bundle()
args.putString("CATEGORY", it)
val productFrag = ProductListFragment()
productFrag.arguments = args
val fragmentManger = activity?.let {
if (it is FragmentActivity)
it.supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, productFrag, "PRODUCTFRAG")
.addToBackStack(null)
.commit()
}
}
})
````````````
the
Viewmodel
````````````
class HomeViewModel : ViewModel() {
var liveDataCategory: MutableLiveData<String> = MutableLiveData()
fun getCategoryForNavigation(): LiveData<String> =liveDataCategory // observe this in fragment.. and nav onChange
fun ResetCategoryForNav()= liveDataCategory.postValue(Categories.SWEATSHIRTS.storeCategories)
fun setCategory( category: String){
liveDataCategory.postValue(category)
Log.d("ONCLICK", "Inside Onclick Viewmodel")
}