android - 如何从 MaterialButton.addOnCheckedChangeListener { "as a lambda" } 获取监听器
问题描述
我有一些MaterialButton
改变检查状态的 s(在切换组场景中)。
我的计划是通过MaterialButton
s监听 Checked 状态addOnCheckedChangeListener
但是当某些情况发生时我需要删除侦听器,如何从 lambda 获取侦听器(对象)(并将其放入onCheckedChangeListener
值中)?
var onCheckedChangeListener: MaterialButton.OnCheckedChangeListener?=null
...
myMaterialButton?.addOnCheckedChangeListener { button, isChecked ->
Log.i(TAG, "onViewCreated: button = $button, isChecked = $isChecked")
if(button.isChecked)
{
//Use some variables which are reachable here
//Do som work
}
else
{
//Use some variables which are reachable here
//Do some other work
}
}
...
//Some condition prior to this causes me to remove the listener by using
//removeOnCheckedChangeListener, but how do I get the onCheckedChangeListener from my
//lambda above which I need to remove ?
myMaterialButton?.removeOnCheckedChangeListener(onCheckedChangeListener)
解决方案当然很简单,但我找不到任何明显的答案。
解决方案
如果您只使用这个单一的侦听器,那么调用会更简单,myMaterialButton?.clearOnCheckedChangeListeners()
因此您不必使用属性跟踪侦听器。
但是,如果您需要删除多个侦听器之一:
您已经正确定义了属性。要在传递给它的方法之外创建侦听器对象,请在 lambda 前面加上接口名称。您可以直接将其分配给您的属性,也可以使用also
范围函数将此侦听器添加到您的按钮。
onCheckedChangeListener = MaterialButton.OnCheckedChangeListener { button, isChecked ->
Log.i(TAG, "onViewCreated: button = $button, isChecked = $isChecked")
if(button.isChecked)
{
//Use some variables which are reachable here
//Do som work
}
else
{
//Use some variables which are reachable here
//Do some other work
}
}.also { myMaterialButton?.addOnCheckedChangeListener(it) }
然后删除它:
onCheckedChangeListener?.let {
myMaterialButton?.removeOnCheckedChangeListener(it)
onCheckedChangeListener = null
}
推荐阅读
- asp.net-core - 授权角色/策略属性在 .Net Core 3 中不起作用
- c# - 为什么音频在我的代码统一中不起作用?统一 c#
- c++ - ruby 本机扩展中的堆栈级别太深错误,如何降低堆栈级别?
- function - 如何在方案中调用函数?
- list - Dart 从地图返回按键排序的值列表
- javascript - element.classList.contains() 和 element.matches() 有什么区别
- c# - 如何使用代码取消 DataGridView 单元格编辑,类似于用户按下 Esc 键时的行为?
- angular - Angular8:对同一组件使用不同的模板
- java - Windows Dockerfile 中错误的 ENTRYPOINT 解析
- angular - 对象字面量只能指定已知属性,而“设置”类型中不存在“按钮”