如何从 MaterialButton.addOnCheckedChangeListener "as a lambda" 获取监听器
Posted
技术标签:
【中文标题】如何从 MaterialButton.addOnCheckedChangeListener "as a lambda" 获取监听器【英文标题】:How do I get the listener from the MaterialButton.addOnCheckedChangeListener "as a lambda" 如何从 MaterialButton.addOnCheckedChangeListener "as a lambda" 获取监听器 【发布时间】:2021-06-06 15:57:35 【问题描述】:我有一些 MaterialButton
s 会更改选中状态(在切换组场景中)。
我的计划是通过MaterialButton
s addOnCheckedChangeListener
收听Checked状态
但是当某些情况发生时我需要删除监听器,我如何从 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)
解决方案当然很简单,但我找不到任何明显的答案。
【问题讨论】:
将该 lambda 函数分配给您的onCheckedChangeListener
,然后执行 myMaterialButton?.addOnCheckedChangeListener(onCheckedChangeListener)
【参考方案1】:
如果您只使用过这个单一的监听器,调用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
【讨论】:
啊,当然……我突然无缘无故失明了……Thnx!! 顺便说一句:在let
子句中包含onCheckedChangeListener=null
是否有任何理由?或者将它放在let
之外是安全/不安全的(当然之后)
它只是避免将其设置为空。差别不大。以上是关于如何从 MaterialButton.addOnCheckedChangeListener "as a lambda" 获取监听器的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数
如何从服务器获取和设置 android 中的 API(从服务器获取 int 值)?如何绑定和实现这个