когда я вызываю обновление из фрагмента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:
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
}
}
Код: Выделить всё
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)
}
}
}
Я хочу, чтобы мой фрагмент наблюдал за изменением живых данных модели представления.
как я могу это исправить?
РЕДАКТИРОВАТЬ:
Я нашел решение, в котором мне следует установить 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
Мобильная версия