除非我调用executePendingBindings,否则我无法触发OnCheckedChangeListener。但是,如果我这样做,Item.java中的setChecked事件就不会被调用。
如何同时调用setChecked和OnCheckedChangeListener?
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="item"
type="com.example.abc.twowaydatabinding.Item" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Switch
android:id="@+id/switch_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="@={item.checked}" />
</LinearLayout>
</layout>
Item.java
import android.databinding.BaseObservable;
import android.databinding.Bindable;
public class Item extends BaseObservable {
private String name;
private Boolean checked;
@Bindable
public String getName() {
return this.name;
}
@Bindable
public Boolean getChecked() {
return this.checked;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
public void setChecked(Boolean checked) {
this.checked = checked;
notifyPropertyChanged(BR.checked);
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
public Item item;
ActivityMainBinding binding;
Switch switch_test;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
item = new Item();
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setItem(item);
switch_test = findViewById(R.id.switch_test);
///binding.executePendingBindings(); -->this will fire OnCheckedChangeListener
switch_test.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Toast.makeText(MainActivity.this, "checked", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "not checked", Toast.LENGTH_SHORT).show();
}
}
});
}
}
答案 0 :(得分:0)
这对我来说并不令人惊讶,因为我知道点击监听器以这种方式工作(只能有一个)。我处理点击的一种方法是onTouchHandler
,但我认为最好的方法是使用item.addOnPropertyChangedCallback()
代替setOnCheckedChangedListener()
。数据绑定的一个好处是,您可以实现MVVM模式,其中ViewModel与UI细节分离。在这种情况下,您可以将实施从Switch
更改为其他内容,并且您的活动代码不必更改(并且您可以取消findViewById()
调用)。