Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android数据绑定:属性更改时视图不更新_Java_Android_Observable_Android Databinding - Fatal编程技术网

Java Android数据绑定:属性更改时视图不更新

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您

让我先从显示代码开始:

build.gradle(模块):

activity_main.xml:

我正在尝试做简单的数据绑定,但是我的视图在属性改变后不会更新。 如图所示,我的代码到达:

            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