Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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
Android 如何在数据绑定库中查看通知?_Android_Observer Pattern_Android Databinding - Fatal编程技术网

Android 如何在数据绑定库中查看通知?

Android 如何在数据绑定库中查看通知?,android,observer-pattern,android-databinding,Android,Observer Pattern,Android Databinding,您好,我的问题是,我的活动正在侦听viewmodel字段更改,但没有调用回调 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainBinding binding = DataBindingU

您好,我的问题是,我的活动正在侦听
viewmodel
字段更改,但没有调用回调

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
    binding.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
        @Override
        public void onPropertyChanged(Observable observable, int i) {
            Log.d(getClass().getSimpleName(), "changed");
        }
    });
    User user = new User("user");
    binding.setUser(user);
    user.setName("newUser");
    }

}
和我的viewModel:

public class User extends BaseObservable {

    public String name;

    public User(String name) {
        this.name = name;
    }

    @Bindable
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    }

}
UI已更新,但未调用回调。我想要一个回调加UI更新。
我想知道数据绑定库是这样工作的!有像Rxjava这样的库,但是我不想导入它。

当您调用
setUser
时,是否希望得到回调?因为事情不是这样的
setUser
在绑定视图上显式设置数据模型视图。如果将任何数据模型属性的值更改到该点之外,则将调用属性更改回调。把你的代码改成这个,我想你会得到回调-

User user = new User("sa");
binding.setUser(user);
user.setName("Johny Depp");   //you should receive the callback beyond this and the UI would update too
编辑- 实现Observable接口的类将允许绑定将单个侦听器附加到绑定对象,以侦听该对象上所有属性的更改

Observable接口具有添加和删除侦听器的机制,但通知由开发人员决定。为了简化开发,创建了一个基类BaseObservable来实现侦听器注册机制。数据类实现者仍然负责在属性更改时发出通知。这是通过将可绑定注释分配给getter并在setter中发出通知来完成的。

执行此操作时:

ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
binding.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
    @Override
    public void onPropertyChanged(Observable observable, int i) {
        Log.d(getClass().getSimpleName(), "changed");
    }
});
User user = new User("user");
binding.setUser(user);
user.setName("newUser");
您应该在提供的回调上收到一个通知,并且应该在调用
binding.setUser(user)
时收到该通知。查找
ActivityMainBinding.java
,您将在应用程序的构建文件夹中看到为类生成的代码。在
setUser()
方法中,您将看到对
notifyPropertyChanged(BR.user)
的调用,该调用将调用您的侦听器

您看到的问题是,所需的数据更改(名称)发生在用户而不是绑定上。为了获得有关用户更改的通知,必须添加如下列表器:

ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
User user = new User("user");
user.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
    @Override
    public void onPropertyChanged(Observable observable, int i) {
        Log.d(getClass().getSimpleName(), "changed");
    }
});
binding.setUser(user);
user.setName("newUser");

任何实现
Observable
接口的东西都将支持任意数量的侦听器,因此您可以随意侦听事件。

事实并非如此,
ActivityMainBinding
对象(ActivityMainBinding)调用
addOnPropertyChangedCallback
,因此,
onPropertyChanged
将仅在
binding.setUser(…)
sry之后调用,但是那里有一个按钮的onclick listener。但当我按下按钮时,UI更新但onPropertyChanged未被调用。从“可观察接口将允许绑定附加到单个侦听器”中,您的意思是除了一个侦听器之外,没有其他侦听器可以附加到侦听器?UI就是那个吗?@pskink我更新了我的代码,这是之前的版本。你测试过吗?