如何从 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 【问题描述】:

我有一些 MaterialButtons 会更改选中状态(在切换组场景中)。

我的计划是通过MaterialButtons 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 适配器调用片段函数

如何从 Firebase 获取所有设备令牌?

如何直接从类调用从接口继承的方法?

如何从服务器获取和设置 android 中的 API(从服务器获取 int 值)?如何绑定和实现这个

如何从Mac从android studio中的fabric注销? [复制]

如何从设备中获取 PDF 文件以便能够从我的应用程序中上传?