如何使用Switch onCheckedChageListener事件的数据绑定?

Moh*_*kar 25 data-binding android android-switch

问题表明,如何将已检查的更改侦听器绑定到xml中的"切换"按钮?

我没有使用回收站视图.只是一个简单的布局.

任何帮助赞赏.

tom*_*ozb 31

使用lambda表达式和Switch:

public void onCheckedChanged(boolean checked) {
     // implementation      
}
Run Code Online (Sandbox Code Playgroud)

XML文件:

<android.support.v7.widget.SwitchCompat
    android:onCheckedChanged="@{(switch, checked) -> item.onCheckedChanged(checked)}"
    ...
/>
Run Code Online (Sandbox Code Playgroud)

item实现onCheckedChange方法的类在哪里并导入到XML文件中,如下所示:

<data>
    <variable
        name="item"
        type="yourClass"/>
</data>
Run Code Online (Sandbox Code Playgroud)


Geo*_*unt 8

您可以使用方法参考来执行此操作:

<CheckBox android:onCheckedChanged="@{callback::checkedChangedListener}".../>
Run Code Online (Sandbox Code Playgroud)

或者如果要传递不同的参数,则使用lambda表达式:

<CheckBox android:onCheckedChanged="@{() -> callback.checked()}".../>
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用我得到`Unknown属性android:onCheckedChanged` (12认同)
  • @TiagoOliveira 虽然我也收到了那个警告,但在启动应用程序后它似乎确实有效 (2认同)

Khe*_*raj 8

不同的方法

(1)通过方法表达式设置

在布局中

<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}"
    />
Run Code Online (Sandbox Code Playgroud)

活动中

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]")
    }
}
Run Code Online (Sandbox Code Playgroud)

(2)通过lambda表达式和方法调用设置

<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)}"
    />
Run Code Online (Sandbox Code Playgroud)

活动中

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]")
    }
}
Run Code Online (Sandbox Code Playgroud)

(3)将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}"
    />
Run Code Online (Sandbox Code Playgroud)

活动中

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]")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

(4)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}"
    />
Run Code Online (Sandbox Code Playgroud)

活动

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]")
    }
}
Run Code Online (Sandbox Code Playgroud)

现在下面将无法正常工作

现在,如果您设置CheckChangeListener的代码无效。因为您不能在一个组件上设置两个回调。绑定已设置了一个回调,因此您的代码回调将不起作用。

binding.mySwitch.setOnCheckedChangeListener { buttonView, isChecked ->
    println("buttonView = [$buttonView], isChecked = [$isChecked]")
}
Run Code Online (Sandbox Code Playgroud)

检查CompoundButtonBindingAdapter类,以了解开关绑定的工作方式。