Android双向数据绑定无法获取事件onCheckedChanged来触发

时间:2018-03-21 17:07:05

标签: android android-databinding

除非我调用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();
                }
            }
        });
    }

}

1 个答案:

答案 0 :(得分:0)

这对我来说并不令人惊讶,因为我知道点击监听器以这种方式工作(只能有一个)。我处理点击的一种方法是onTouchHandler,但我认为最好的方法是使用item.addOnPropertyChangedCallback()代替setOnCheckedChangedListener()。数据绑定的一个好处是,您可以实现MVVM模式,其中ViewModel与UI细节分离。在这种情况下,您可以将实施从Switch更改为其他内容,并且您的活动代码不必更改(并且您可以取消findViewById()调用)。