Почему мой фрагмент не наблюдает изменения живых данных в модели представленияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему мой фрагмент не наблюдает изменения живых данных в модели представления

Сообщение Anonymous »

У меня есть текущие данные (isEquipmentTabEnabled) в модели представления. я обновляю его во фрагменте1 и наблюдаю во фрагменте2.
когда я вызываю обновление из фрагмента1, метод обновления в вызове модели представления, но затем изменение не наблюдается во фрагменте2. это мой код:
//Обновление
Я регистрирую видимость фрагмента 1, и он не виден.
Я думаю, что моя проблема заключается в использовании viewpager
Я сократил код и наблюдаю правильно это во фрагменте 1, но я не наблюдаю этого во фрагменте 2
Моя модель представления:

Код: Выделить всё

class NetworkDisadvantageVm @Inject constructor(
var applicationn: Application,
var networkDisadvantageManager: NetworkDisadvantageManager,
var goodsItemManager: GoodsItemManager,
var gson: Gson
) : BaseVm(applicationn) {
private var isEquipmentTabEnabled = MutableLiveData(false)

val getIsEquipmentTabEnabled: MutableLiveData
get() = isEquipmentTabEnabled

fun updateIsEquipmentTab(condition: Boolean) {
isEquipmentTabEnabled.value = condition
}

override fun handleUserAction(action: String, data: Any) {
when (action) {

}
}

companion object {
const val ACTION_UPDATE_NETWORK_DISADVANAGE = "ACTION_UPDATE_NETWORK_DISADVANAGE"
const val ACTION_ERROR_UPDATE_NETWORK_DISADVANAGE = "ACTION_ERROR_UPDATE_NETWORK_DISADVANAGE"

}
}
my fragment 1:
class NetWorkDisadvantageDetailFragment : BaseFragment() {
private var _binding: NabNetworkDisadvantageFragmentBinding? = null
частная lateinit var mNetWorkDisadvantageViewModel: NetworkDisadvantageVm
частная lateinit var Mission: Миссия

Код: Выделить всё

   override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mNetWorkDisadvantageViewModel = ViewModelProviders.of(this, mViewModelFactory)
.get(NetworkDisadvantageVm::class.java)

}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = NabNetworkDisadvantageFragmentBinding.inflate(inflater, container, false)
val view = binding.root

binding.datetext.text = GeneralUtil.convertPersianDate(GeneralUtil.Now())
binding.datetext.tag = GeneralUtil.getDateFormat().format(GeneralUtil.Now())*/
binding.takenAction.setOnClickListener { onRadioButtonClicked(it) }
binding.inProgressReferTo.setOnClickListener { onRadioButtonClicked(it) }
binding.tempActionReferTo.setOnClickListener { onRadioButtonClicked(it) }
binding.CustomerAbsence.setOnClickListener { onRadioButtonClicked(it) }
binding.notSeen.setOnClickListener { onRadioButtonClicked(it) }
binding.wrongAddressNoActionTaken.setOnClickListener { onRadioButtonClicked(it) }
return view

}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mNetWorkDisadvantageViewModel.getIsEquipmentTabEnabled.observe(viewLifecycleOwner) { isEnabled ->
Log.e("test","tet")
}

}

private val binding get() = _binding!!

private fun onRadioButtonClicked(view: View) {
val checked = (view as RadioButton).isChecked

// Check which RadioButton was clicked and deselect others
when (view.id) {
binding.takenAction.id -> {
if (checked) {
mNetWorkDisadvantageViewModel.updateIsEquipmentTab(true)
binding.inProgressReferTo.isChecked = false

}
}

binding.inProgressReferTo.id -> {

if (checked) {
mNetWorkDisadvantageViewModel.updateIsEquipmentTab(false)
binding.notSeen.isChecked = false

// Handle other RadioButton selections here
}
}

binding.tempActionReferTo.id -> {
if (checked) {
mNetWorkDisadvantageViewModel.updateIsEquipmentTab(false)

binding.inProgressReferTo.isChecked = false

}
}

binding.CustomerAbsence.id -> {
if (checked) {
mNetWorkDisadvantageViewModel.updateIsEquipmentTab(false)

binding.takenAction.isChecked = false

// Handle other RadioButton selections here
}
}

binding.notSeen.id ->  {
if (checked) {
mNetWorkDisadvantageViewModel.updateIsEquipmentTab(false)

binding.inProgressReferTo.isChecked = false

}
}

binding.wrongAddressNoActionTaken.id -> {
if (checked) {
mNetWorkDisadvantageViewModel.updateIsEquipmentTab(false)

binding.takenAction.isChecked = false
binding.tempActionReferTo.isChecked = false
binding.inProgressReferTo.isChecked = false
binding.CustomerAbsence.isChecked = false
binding.notSeen.isChecked = false
// Handle other RadioButton selections here
}
}

}
}

companion object {
fun newInstance(mission: Mission) = NetWorkDisadvantageDetailFragment().apply {
this.mission = mission
}
}
а это мой фрагмент 2:

Код: Выделить всё

class NetworkDisadvantageFragment: BaseFullScreenDialogFragment() {
private lateinit var mViewModel: NetworkDisadvantageVm
private var _binding: NabTabLayoutBinding? = null
private lateinit var mission: Mission

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mViewModel = ViewModelProviders.of(this, mViewModelFactory)
.get(NetworkDisadvantageVm::class.java)

}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = NabTabLayoutBinding.inflate(inflater, container, false)
val view = binding.root
val networkDisadvantage= NetWorkDisadvantageDetailFragment.newInstance(mission)
val goodsItem= GoodsItemFragment.newInstance(mission)
val title = listOf("اجناس", "فرم اقدام")
val frgs = listOf(goodsItem, networkDisadvantage)
val adaptor= FragmentAdaptor(requireActivity(),
frgs as List, title
)
binding.viewPager.adapter = adaptor
binding.viewPager.currentItem = 2
TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position ->
tab.text = title[position]
}.attach()

return view

}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mViewModel.getIsEquipmentTabEnabled.observe(viewLifecycleOwner) { isEnabled ->
val tabStrip = binding.tabLayout.getChildAt(0) as LinearLayout
val tabView = tabStrip.getChildAt(0)
tabView.isEnabled = isEnabled
tabView.isClickable = isEnabled
}
}

private val binding get() = _binding!!
companion object{
fun newInstance(mission: Mission) = NetworkDisadvantageFragment().apply {
this.mission = mission
}
}
}

а это поставщик модели представления:

Код: Выделить всё

package com.edsab.takrim.injection.component

@Subcomponent
interface ViewModelSubComponent {
@Subcomponent.Builder
interface Builder {
fun build(): ViewModelSubComponent
}

fun NetworkDisadvantageVm(): NetworkDisadvantageVm
fun NetWorkDisadvantageDetailVm(): NetWorkDisadvantageDetailVm

}

@Singleton
class ViewModelFactory @Inject constructor(viewModelSubComponent: ViewModelSubComponent) : ViewModelProvider.Factory {
private val creators: ArrayMap = ArrayMap()

init {
// View models cannot be injected directly because they won't be bound to the owner's
// view model scope.

creators[NetworkDisadvantageVm::class.java] = Callable { viewModelSubComponent.NetworkDisadvantageVm() }
creators[NetWorkDisadvantageDetailVm::class.java] = Callable { viewModelSubComponent.NetWorkDisadvantageDetailVm() }

}

override fun   create(modelClass: Class): T {
var creator = creators.get(modelClass)
if (creator == null) {

creators.forEach { entry ->
if (modelClass.isAssignableFrom(entry.key)) {
creator = entry.value
}

}

}
if (creator == null) {
throw IllegalArgumentException("Unknown model class $modelClass")
}
try {
return creator?.call() as T
} catch (e: Exception) {
throw RuntimeException(e)
}

}
}
Я регистрирую состояние фрагмента и его состояние возобновляется. и когда я отлаживаю Java-класс LiveData, я вижу, что наблюдатель представляет собой пустой список!
Я хочу, чтобы мой фрагмент наблюдал за изменением живых данных модели представления.
как я могу это исправить?
РЕДАКТИРОВАТЬ:
Я нашел решение, в котором мне следует установить reuireactivity()this в этой строке в двух фрагментах:

Код: Выделить всё

 mViewModel = ViewModelProviders.of(this, mViewModelFactory)
.get(NetworkDisadvantageVm::class.java)
изменить на

Код: Выделить всё

 mViewModel = ViewModelProviders.of(requireActivity(), mViewModelFactory)
.get(NetworkDisadvantageVm::class.java)
это правильный способ справиться с этим?

Подробнее здесь: https://stackoverflow.com/questions/783 ... view-model
Ответить

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

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

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

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

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