Android 数据绑定-onActivityResult之后不更新XML

Android 数据绑定-onActivityResult之后不更新XML,android,android-activity,android-databinding,Android,Android Activity,Android Databinding,更新活动的活动结果(..)中的可观察字段,但不将该值反映到XML。如果我调用executePendingBindings(),它就会工作。但问题是,有很多可观察字段,对于每个变量,我都需要调用executePendingBindings() 有人知道如何解决这个问题吗?在ViewDataBinding.java文件中,有一种方法可以请求重新绑定 protected void requestRebind() { if (mContainingBinding != null) {

更新
活动的
活动结果(..)
中的
可观察字段
,但不将该值反映到
XML
。如果我调用executePendingBindings(),它就会工作。但问题是,有很多
可观察字段
,对于每个变量,我都需要调用
executePendingBindings()


有人知道如何解决这个问题吗?

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
将为false,并通过此方法将其变为true<代码>mChoreographer.postFrameCallback(mFrameCallback)
将使该变量再次变为false,以便其他绑定将更新该视图

问题是
!state.isatalast(Lifecycle.state.STARTED)
条件。由于ObservableField是从ActivityResult(..)更新的,因此当前状态将是
Lifecycle.state.CREATED
,因此条件将失败并返回该方法,而不调用
mChoreographer.postFrameCallback(mFrameCallback)
mPendingRebind
将为真。因此,剩余的绑定将不会更新

因此,解决方案是调用
SingleLiveEvent
并观察该变量。收到回调后,我们必须更新observeField()

例如:

val updateObserver = SingleLiveEvent<Unit>()
从onActivityResult调用该事件

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == 111 && resultCode == Activity.RESULT_OK) {
               updateObserver.call()
            }
    }

如果您不想创建
SingleLiveEvent
,并且希望将回调代码保留在
onActivityResult
中,并且您有一个所有活动都从其扩展而来的基本活动,则可以在基本活动中添加
scheduleUpdateAfterOnActivityResult
方法:

//运行onActivityResult时,该活动仍处于Lifecycle.State.CREATED和
//绑定不会开火。通过创建新的MutableLiveData来计划更新,
//当活动生命周期处于活动状态时,将触发观察者。
//另见https://stackoverflow.com/questions/53104670/data-binding-xml-not-updating-after-onactivityresult/53107092
public void scheduleUpdateAfterOnActivityResult(T数据,观察者){
final MutableLiveData liveData=新的MutableLiveData();
liveData.observe(这个,新的观察者(){
@凌驾
更改后的公共无效(@Nullable final tV){
观察员:一经改变(五);
removeObserver(这个);
}
});
postValue(数据);
}
然后在
onActivityResult
调用
scheduleUpdateAfterOnActivityResult()

@覆盖
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
if(requestCode==REQUEST\u CODE\u XXXX&&data!=null){
scheduleUpdateAfterOnActivityResult(数据,捆绑包->{
//做点什么
}
}
super.onActivityResult(请求代码、结果代码、数据);
}

我面临着类似的问题,但在我的例子中,与xml的绑定完全被破坏了。原因是,在恢复活动或片段之前调用了onActivityResult。因此,lifecycleowner的状态至少没有启动,绑定也不会被执行。请参阅Sangeet Suresh answer的代码示例。我不知道为什么要使用bindin当你的lifecycleowner再次恢复时,g不会被执行。可能有错误吗?@ThomasMeinhart我是问这个问题的人。过了一段时间,我找到了答案,就写在这里。对不起,我应该一直读到最后。它不起作用。添加此代码后没有变化
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == 111 && resultCode == Activity.RESULT_OK) {
               updateObserver.call()
            }
    }