В файле ViewDataBinding.java
есть один метод для запроса повторного связывания
protected void requestRebind() {
if (mContainingBinding != null) {
mContainingBinding.requestRebind();
} else {
synchronized (this) {
if (mPendingRebind) {
return;
}
mPendingRebind = true;
}
if (mLifecycleOwner != null) {
Lifecycle.State state = mLifecycleOwner.getLifecycle().getCurrentState();
if (!state.isAtLeast(Lifecycle.State.STARTED)) {
return; // wait until lifecycle owner is started
}
}
if (USE_CHOREOGRAPHER) {
mChoreographer.postFrameCallback(mFrameCallback);
} else {
mUIThreadHandler.post(mRebindRunnable);
}
}
}
Когда элемент управления входит в этот метод, mPendingRebind
будет ложным, и этот метод станет истинным. mChoreographer.postFrameCallback(mFrameCallback);
сделает эту переменную снова ложной, чтобы другие привязки обновили представление.
Проблема была в !state.isAtLeast(Lifecycle.State.STARTED)
состоянии. Поскольку ObservableField обновляется с onActivityResult(..)
, текущее состояние будет Lifecycle.State.CREATED
, поэтому это условие не будет выполнено и вернет этот метод без вызова mChoreographer.postFrameCallback(mFrameCallback);
и mPendingRebind
будет истинным. Таким образом, оставшиеся привязки не будут обновляться.
Таким образом, решение было вызвать SingleLiveEvent
и наблюдать за этой переменной. Когда этот обратный вызов получен, мы должны обновить ObservableField ()
Например:
val updateObserver = SingleLiveEvent<Unit>()
Тогда наблюдайте за этим событием
updateObserver.observe(this, Observer {
//update ObservableField
})
Вызовите это событие из onActivityResult
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == 111 && resultCode == Activity.RESULT_OK) {
updateObserver.call()
}
}