如问题所示,如何在xml中将checked change listener绑定到Switch开关按钮?
我没有使用RecyclerView,只是一个简单的布局。
感谢任何帮助。
我没有使用RecyclerView,只是一个简单的布局。
感谢任何帮助。
使用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>
在布局中
<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]")
}
}
如果你在代码中设置CheckChangeListener
,那么它将不起作用。因为你无法在一个组件上设置两个回调函数。一个回调函数已经被绑定设置了,所以你在代码中的回调函数将不起作用。
binding.mySwitch.setOnCheckedChangeListener { buttonView, isChecked -> println("buttonView = [$buttonView], isChecked = [$isChecked]") }
android:layout="@layout/custom"
并传递一个数据绑定的标题“passedTitle”,我可以使用<include>成功地执行如下操作:<include layout="@layout/custom" bind:passedTitle="@{@string/title}" />
,但如果我只是在preference中这样做,它什么也不做(我得到attribute passedTitle not found
):<SwitchPreference android:key="@string/key" layout="@layout/custom" bind:passedTitle="@{@string/title}"
- Ellipticaandroid:onCheckedChanged
应该在 viewModel 中触发一个请求。 - user924你可以使用方法引用来完成它:
<CheckBox android:onCheckedChanged="@{callback::checkedChangedListener}".../>
或者,如果你想传递不同的参数,可以使用 Lambda 表达式:
<CheckBox android:onCheckedChanged="@{() -> callback.checked()}".../>
只需在您的ViewModel上首先使用ViewModel、LiveData和Transformations。
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}"
...>
就是这样。