- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个代码:
ViewThreeObserver observer = my_view.getViewTreeObserver();
observer.addOnScrollChangedListener(new OnScrollChangedListener() {
@Override
public void onScrollChanged() {
if(condition) {
//do something
}
}
});
现在,如果条件得到验证,我将删除观察者的监听器。我试过:
observer.addOnScrollChangedListener(null);
但是我收到一个错误,声称“ViewThreeObserver 不存在”。这是什么意思,我如何才能正确移除监听器?
最佳答案
observer
是一个长期存在的引用,它不能保证在 View 的生命周期内有效。相反,您可以再次在您的 View 上调用 getViewTreeObserver
并删除监听器(如 Ahmad 所述,使用 removeOnScrollChangedListener)。
my_view.getViewTreeObserver().removeOnScrollChangedListener(this);
虽然这是一个短暂的调用,但它有可能不活跃,因此您可以事先检查它的 isAlive(我自己从未经历过)。
您也可以在 observer
上使用 isAlive
如果您愿意(很可能不会活着)并使用它来移除监听器。如果 observer
不存在,您仍然需要调用 getViewTreeObserver
。
Returns the ViewTreeObserver for this view's hierarchy. The view tree observer can be used to get notifications when global events, like layout, happen. The returned ViewTreeObserver observer is not guaranteed to remain valid for the lifetime of this View. If the caller of this method keeps a long-lived reference to ViewTreeObserver, it should always check for the return value of isAlive().
我见过很多不同的变体,这里有几个:
关于android - 从 ViewThreeObserver 移除 OnScrollChangedListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23313618/
我有这个代码: ViewThreeObserver observer = my_view.getViewTreeObserver(); observer.addOnScrollChangedListe
我是一名优秀的程序员,十分优秀!