質問が示すように、チェックされた変更リスナーをxmlのスイッチボタンにバインドする方法は?
リサイクルビューを使用していません。シンプルなレイアウト。
任意の助けに感謝します。
メソッド参照でそれを行うことができます:
<CheckBox Android:onCheckedChanged="@{callback::checkedChangedListener}".../>
または、異なるパラメーターを渡す場合はラムダ式を使用します。
<CheckBox Android:onCheckedChanged="@{() -> callback.checked()}".../>
ラムダ式と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
を設定すると、動作しないコードになります。 1つのコンポーネントに2つのコールバックを設定できないためです。バインドによって1つのコールバックが既に設定されているため、コード内のコールバックは機能しません。
binding.mySwitch.setOnCheckedChangeListener { buttonView, isChecked -> println("buttonView = [$buttonView], isChecked = [$isChecked]") }
CheckCompoundButtonBindingAdapterclass Switch Bindingの動作を確認します。