问题:
我的活动在屏幕中间有共享按钮、共享标题、共享进程栏和容器,其中片段被替换。
所以我有活动的视图模型 - ActivityViewModel ,其中有以下可观察的:
val mNavigationToMainActivity = CompletableSubject.create()
val mNavigationToUsername = PublishSubject.create<Any>()
val mNavigationToPassword = PublishSubject.create<Any>()
val mNavigationToChangePassword = PublishSubject.create<LoginItem>()
val mProcessBar = PublishSubject.create<Int>()
val mContinueButtonEnabled = BehaviorSubject.createDefault(false)
val mContinueClick = PublishSubject.create<Any>()
val mChangeTitleSubject = BehaviorSubject.createDefault(false)
val mLoadingIndicatorSubject = BehaviorSubject.createDefault(false)
并且在调用 FragmentViewModel 的片段之间存在共享视图模型。所有片段都使用相同的视图模型
现在的问题是片段的视图模型如何访问活动的视图模型?例如,当用户单击登录按钮时,我希望 fragmentviewmodel 可以访问活动的加载程序,然后导航到下一个屏幕。
或者例如在输入有效时启用按钮
所以这就是我在这些之间进行交流的方式:
fun <T> PublishSubject<T>.bind(subject: PublishSubject<T>): Disposable {
return subscribe({ subject.onNext(it) }, { throwable -> subject.onError(throwable) })
}
fun <T> BehaviorSubject<T>.bind(subject: BehaviorSubject<T>): Disposable {
return subscribe({ subject.onNext(it) }, { throwable -> subject.onError(throwable) })
}
fun CompletableSubject.bind(subject: CompletableSubject): Disposable {
return subscribe({ subject.onComplete() }, { throwable -> subject.onError(throwable) })
}
我让片段的视图模型来扩展活动的视图模型有点像基本视图模型
所以这是活动的视图模型
公开课 IntroViewModel : BaseViewModel() {
val mNavigationToMainActivity = CompletableSubject.create()
val mNavigationToUsername = PublishSubject.create<Any>()
val mNavigationToPassword = PublishSubject.create<Any>()
val mNavigationToChangePassword = PublishSubject.create<LoginItem>()
val mProcessBar = PublishSubject.create<Int>()
val mContinueButtonEnabled = BehaviorSubject.createDefault(false)
val mContinueClick = PublishSubject.create<Any>()
val mChangeTitleSubject = BehaviorSubject.createDefault(false)
fun bind(introViewModel: IntroViewModel){
mNavigationToUsername.bind(introViewModel.mNavigationToUsername).addDisposable()
mNavigationToPassword.bind(introViewModel.mNavigationToPassword).addDisposable()
mNavigationToChangePassword.bind(introViewModel.mNavigationToChangePassword).addDisposable()
mNavigationToMainActivity.bind(introViewModel.mNavigationToMainActivity).addDisposable()
mProcessBar.bind(introViewModel.mProcessBar).addDisposable()
mContinueButtonEnabled.bind(introViewModel.mContinueButtonEnabled).addDisposable()
}
fun continueClicked() {
mContinueClick.onNext(Any())
}
} 这是片段
class ChangePasswordViewModel(private val userRepository: UserRepository)
: IntroViewModel() {
并且在每个片段内部,我将活动的视图模型绑定到片段的视图模型
viewModel = ViewModelProviders.of(activity!!, viewModelFactory).get(ChangePasswordViewModel::class.java)
viewModel.start(2,arguments?.getParcelable(LoginItem::class.simpleName))
ViewModelProviders.of(activity!!, viewModelFactory).get(IntroViewModel::class.java).apply {
viewModel.bind(this)
}
它很讨厌,我真的不喜欢它。你能帮我吗?