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我更新了我的代码,这是之前的版本。你测试过吗?