微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 MaterialButton.addOnCheckedChangeListener { "as a lambda" } 获取监听器

如何解决如何从 MaterialButton.addOnCheckedChangeListener { "as a lambda" } 获取监听器

我有一些 MaterialButton 可以改变选中状态(在切换组场景中)。

我的计划是通过 MaterialButtonaddOnCheckedchangelistener

监听 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)



解决方案当然很简单,但我找不到任何明显的答案。

解决方法

如果您只使用这个单一的侦听器,调用 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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。