【发布时间】:2016-09-13 02:35:25
【问题描述】:
如问题所示,如何将选中的更改侦听器绑定到 xml 中的切换按钮?
我没有使用回收站视图。只是一个简单的布局。
任何帮助表示赞赏。
【问题讨论】:
-
动态设置有什么问题?
-
我们可以在项目的其他地方使用相同的视图模型,使用磁盘缓存的可观察字段吗?
标签: android data-binding android-switch
如问题所示,如何将选中的更改侦听器绑定到 xml 中的切换按钮?
我没有使用回收站视图。只是一个简单的布局。
任何帮助表示赞赏。
【问题讨论】:
标签: android data-binding android-switch
只需使用 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}"
...>
就是这样。
【讨论】:
在布局中
<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]")
}
Check CompoundButtonBindingAdapter class 看看 Switch Binding 是如何工作的。
【讨论】:
android:layout="@layout/custom" 并将该布局传递给数据绑定标题“passedTitle”,我可以使用 <include layout="@layout/custom" bind:passedTitle="@{@string/title}" />,但是如果我只是在偏好中这样做,它不会做任何事情(我得到attribute passedTitle not found):<SwitchPreference android:key="@string/key" layout="@layout/custom" bind:passedTitle="@{@string/title}"使用 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>
【讨论】:
checked 属性有什么问题?你可以很容易地绑定它
您可以通过方法参考来做到这一点:
<CheckBox android:onCheckedChanged="@{callback::checkedChangedListener}".../>
如果您想传递不同的参数,也可以使用 lambda 表达式:
<CheckBox android:onCheckedChanged="@{() -> callback.checked()}".../>
【讨论】:
Unknown attribute android:onCheckedChanged