Java Android数据绑定:属性更改时视图不更新
让我先从显示代码开始: build.gradle(模块): activity_main.xml: 我正在尝试做简单的数据绑定,但是我的视图在属性改变后不会更新。 如图所示,我的代码到达:Java Android数据绑定:属性更改时视图不更新,java,android,observable,android-databinding,Java,Android,Observable,Android Databinding,让我先从显示代码开始: build.gradle(模块): activity_main.xml: 我正在尝试做简单的数据绑定,但是我的视图在属性改变后不会更新。 如图所示,我的代码到达: notifyPropertyChanged(com.example.oryaa.basecalculator.BR.calcResult); 但是,只有当应用程序启动时,或者当我将手机从垂直旋转到水平或从垂直旋转到水平时,视图才会更新 我的问题在哪里 非常感谢, 或者Yaacov您
notifyPropertyChanged(com.example.oryaa.basecalculator.BR.calcResult);
但是,只有当应用程序启动时,或者当我将手机从垂直旋转到水平或从垂直旋转到水平时,视图才会更新
我的问题在哪里
非常感谢,
或者Yaacov您需要调用
executePendingBindings()
以立即更新视图中的绑定值:
当一个变量或可观察到的更改时,绑定将被安排在下一帧之前更改。然而,有时必须立即执行绑定。要强制执行,请使用executePendingBindings()方法
有关更多信息,请参阅第章
getCalcResult()
应该是公共的BaseView
应该扩展BaseObservable
notifyPropertyChanged()
。与此相反,如果需要动态更改模型值,请使用@Bindable
属性public class BaseCalcModel extends BaseObservable {
private String calcResult;
private BaseView firstNumView;
private BaseView secondNumView;
private BaseView resultNumView;
private int firstNumBase;
private int secondNumBase;
private int resultNumBase;
private String error;
public String getCalcResult() {
return calcResult;
}
public void setCalcResult(String calcResult) {
this.calcResult = calcResult;
}
public BaseView getFirstNumView() {
return firstNumView;
}
public void setFirstNumView(BaseView firstNumView) {
this.firstNumView = firstNumView;
}
public BaseView getSecondNumView() {
return secondNumView;
}
public void setSecondNumView(BaseView secondNumView) {
this.secondNumView = secondNumView;
}
public BaseView getResultNumView() {
return resultNumView;
}
public void setResultNumView(BaseView resultNumView) {
this.resultNumView = resultNumView;
}
public int getFirstNumBase() {
return firstNumBase;
}
public void setFirstNumBase(int firstNumBase) {
this.firstNumBase = firstNumBase;
}
public int getSecondNumBase() {
return secondNumBase;
}
public void setSecondNumBase(int secondNumBase) {
this.secondNumBase = secondNumBase;
}
public int getResultNumBase() {
return resultNumBase;
}
public void setResultNumBase(int resultNumBase) {
this.resultNumBase = resultNumBase;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
}我在事件发生后需要刷新视图时遇到了类似的问题,我的可变对象不可见,因此我添加了以下内容:
binding?.invalidateAll()
我希望这会有所帮助。如果您在
LiveData
中遇到此问题,您可能忘记设置绑定的生命周期所有者;
binding.setLifecycleOwner(lifecycleOwner)
当数据绑定对您不起作用时,请确保您正在更新相同的对象字段<代码>对象的实例必须相同才能更新UI。
也许我的答案对某些人有帮助,享受编码吧 我也有同样的问题。显然是一条线引起了这个问题。您只需将
licycleowner
设置为绑定
binding.lifecycleOwner = this
从MainActivity()“setContentView(R.layout.activity_main);”中删除这一行,然后重试。不,仍然不起作用。请尝试将字段设置为私有。它可能更喜欢访问字段而不是访问器方法。为什么您的DTO会保留
BaseView
?我怀疑这和这个问题有关,但听起来很糟糕practice@GeorgeMount如果我将所有字段更改为private,我将得到下一个competation错误:错误:(14,52)错误:package com.example.oryaa.basecalculator.databinding不存在错误:任务执行失败:app:compiledBugJavaWithJavaC'>java.lang.RuntimeException:发现数据绑定错误。****/数据绑定错误****消息:找不到访问者com.example.oryaa.basecalculator.BaseCalcModel.calcResult文件:…\activity\u main.xml loc:78:28-78:51****\data binding error****和KirillKulakov BaseView是一个包含4个字符串的自制对象。这是最佳解决方案吗?invalidateAll
对我有效executePendingBindings
不会。binding?.invalidateAll()会导致奇怪的布局问题,应该避免。如果数据需要处理状态更改,则更愿意使用LiveData
或observefield
s包装数据并将其传递到绑定中。对我来说,就是这样。非常感谢。
notifyPropertyChanged(com.example.oryaa.basecalculator.BR.calcResult);
public class BaseCalcModel extends BaseObservable {
private String calcResult;
private BaseView firstNumView;
private BaseView secondNumView;
private BaseView resultNumView;
private int firstNumBase;
private int secondNumBase;
private int resultNumBase;
private String error;
public String getCalcResult() {
return calcResult;
}
public void setCalcResult(String calcResult) {
this.calcResult = calcResult;
}
public BaseView getFirstNumView() {
return firstNumView;
}
public void setFirstNumView(BaseView firstNumView) {
this.firstNumView = firstNumView;
}
public BaseView getSecondNumView() {
return secondNumView;
}
public void setSecondNumView(BaseView secondNumView) {
this.secondNumView = secondNumView;
}
public BaseView getResultNumView() {
return resultNumView;
}
public void setResultNumView(BaseView resultNumView) {
this.resultNumView = resultNumView;
}
public int getFirstNumBase() {
return firstNumBase;
}
public void setFirstNumBase(int firstNumBase) {
this.firstNumBase = firstNumBase;
}
public int getSecondNumBase() {
return secondNumBase;
}
public void setSecondNumBase(int secondNumBase) {
this.secondNumBase = secondNumBase;
}
public int getResultNumBase() {
return resultNumBase;
}
public void setResultNumBase(int resultNumBase) {
this.resultNumBase = resultNumBase;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
binding?.invalidateAll()
binding.lifecycleOwner = this