【问题标题】:Remove a listener from a view in android从android中的视图中删除监听器
【发布时间】:2011-06-06 04:48:21
【问题描述】:

有没有办法从android中的View中删除一个监听器?我有一个Checkbox,我附加了一个CheckChangedListener。问题是在它上面调用setChecked() 会导致我的监听器触发。

如果我不能只删除一个监听器,有没有办法阻止监听器在我手动调用 setChecked() 而不是从触摸事件中检查时触发?

【问题讨论】:

    标签: android view checkbox listener


    【解决方案1】:

    我在 Spinner 视图中遇到过类似的问题。我的解决方案是创建一个在OnItemSelected 方法中检查的类成员变量。在我以编程方式更改 Spinner 的内容/选择之前,我将此变量设置为 true。当OnItemSelected 触发时,如果变量是true,我将其更改为false 并且只是return 而不做任何工作。这样做的缺点是它使故障排除变得困难,因为这个变量在我的代码中全部设置。

    【讨论】:

      【解决方案2】:

      您只需使用 removeListener(this)。我在这里遗漏了什么吗?

      【讨论】:

        【解决方案3】:

        嗯,我找到了答案。这似乎没有在任何地方记录,但我浏览了 View 类的代码,如果您将 null 传递给 setClickListener 方法,它将删除侦听器。

        checkbox.setOnCheckChangedListener(null);
        

        这应该适用于任何事件监听器。

        【讨论】:

        • 请谨慎使用未记录的功能,它们随时可能更改。
        • 我不会完全称其为“未记录的功能”。如果视图支持给定类型的单个侦听器,并且您将该侦听器设置为 null,您还期望发生什么? :)
        • 这不是一个未记录的功能。只是没有证明传入 null 是安全的,它就是这样。视图使用的内部侦听器在构造时以 null 开始,并在确定是否调度事件时检查是否为 null。设置 null 只是将其重置为设置侦听器之前的值。
        • 这一切都很好,但如果视图在列表中,您还需要将视图设置为 GONE,以便重新启用列表视图 onListItemClick。
        • 不是说要setOnCheckedChangeListener吗?
        【解决方案4】:

        为什么你有checkChangeListener?如果您使用onClicklListener,它可能对您有用吗?

        【讨论】:

          【解决方案5】:

          您可以尝试在调用setChecked() 之前将侦听器设置为不执行任何操作的侦听器,然后再将有用的侦听器放回去。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-30
            • 1970-01-01
            • 2014-01-25
            • 2018-05-15
            • 2016-04-20
            • 1970-01-01
            相关资源
            最近更新 更多