如问题所示,如何将已检查的更改侦听器绑定到xml中的“切换”按钮?
我没有使用回收站视图。只是一个简单的布局。
任何帮助表示感谢。
答案 0 :(得分:24)
使用lambda表达式和Switch
:
public void onCheckedChanged(boolean checked) {
// implementation
}
XML文件:
<android.support.v7.widget.SwitchCompat
android:onCheckedChanged="@{(switch, checked) -> item.onCheckedChanged(checked)}"
...
/>
其中item
是实现onCheckedChange
方法的类,并导入XML文件,如下所示:
<data>
<variable
name="item"
type="yourClass"/>
</data>
答案 1 :(得分:8)
您可以使用方法参考:
<CheckBox android:onCheckedChanged="@{callback::checkedChangedListener}".../>
如果要传递不同的参数,请使用或lambda表达式:
<CheckBox android:onCheckedChanged="@{() -> callback.checked()}".../>
答案 2 :(得分:5)
以下是在数据绑定中设置OnCheckedChangeListener
的方法:
在布局中
<variable
name="activity"
type="com.innovanathinklabs.sample.activities.CalendarActivity"/>
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="@={model.checked}"
android:onCheckedChanged="@{activity::onGenderChanged}"
/>
活动中
class HomeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar)
binding.activity = this
binding.model = Model()
}
fun onGenderChanged(buttonView: CompoundButton, isChecked: Boolean) {
println("buttonView = [$buttonView], isChecked = [$isChecked]")
}
}
<variable
name="model"
type="com.innovanathinklabs.sample.data.Model"/>
<variable
name="activity"
type="com.innovanathinklabs.sample.activities.HomeActivity"/>
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="@={model.checked}"
android:onCheckedChanged="@{(button, bool)-> activity.saveGender(bool)}"
/>
活动中
class HomeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar)
binding.activity = this
binding.model = Model()
}
fun saveGender(isChecked: Boolean) {
println("isChecked = [$isChecked]")
}
}
OnCheckedChangeListener
匿名类传递给布局<variable
name="onGenderChange"
type="android.widget.CompoundButton.OnCheckedChangeListener"/>
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="@={model.checked}"
android:onCheckedChanged="@{onGenderChange}"
/>
活动中
class HomeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar)
binding.model = Model()
binding.setOnGenderChange { buttonView, isChecked ->
println("buttonView = [$buttonView], isChecked = [$isChecked]")
}
}
}
OnCheckedChangeListener
<variable
name="onGenderChange2"
type="android.widget.CompoundButton.OnCheckedChangeListener"/>
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="@={model.checked}"
android:onCheckedChanged="@{onGenderChange2}"
/>
活动
class HomeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar)
binding.model = Model()
binding.onGenderChange2 = onGenderChange
}
private val onGenderChange: CompoundButton.OnCheckedChangeListener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
println("buttonView = [$buttonView], isChecked = [$isChecked]")
}
}
因为您不能在一个组件上设置两个回调。已经通过两种方式绑定设置了一个回调,因此您的回调将不起作用。
binding.mySwitch.setOnCheckedChangeListener { buttonView, isChecked ->
println("buttonView = [$buttonView], isChecked = [$isChecked]")
}
Check CompoundButtonBindingAdapter class,了解Switch Binding的工作原理。
答案 3 :(得分:1)
只需使用ViewModel,liveData和Transformations 首先在您的ViewModel上
var availabilityState = MutableLiveData<Boolean>(false)
val availabilityText :LiveData<String> =Transformations.map(availabilityState)
{
if (it == true)
{
"Available"
}else
{
"Not Available"
}
}
然后在您的XML上使用
<Switch
android:checked="@={addBookViewModel.availabilityState}"
android:text="@{addBookViewModel.availabilityText}"
...>
就是这样。