- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个问题,在特定情况下,当我在我的自定义 View 中调用 setVisibility(GONE)
时,它的 onVisibilityChanged
方法没有被调用,实际上它没有尽管 getVisibility()
之后返回 8
(或 GONE
),但隐藏 View 。
这是我知道可见性发生变化但未调用 onVisibilityChanged 的方式。
@Override
protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
Log.i(LOG_TAG, "onVisibilityChanged: " + visibility);
super.onVisibilityChanged(changedView, visibility);
}
@Override
public void setVisibility(int visibility) {
super.setVisibility(visibility);
Log.i(LOG_TAG, "setVisibility: " + visibility);
}
public void hide(){
Log.i(LOG_TAG, "before hide visibility: " + getVisibility());
setVisibility(GONE);
Log.i(LOG_TAG, "after hide visibility: " + getVisibility());
}
通常当我调用 hide()
时,我会在日志中看到这些行:
before hide visibility: 0
onVisibilityChanged: 8
setVisibility: 8
after hide visibility: 8
但是在特定情况下,当我调用 hide()
时,我在日志中得到了这些行,并且此后 View 没有隐藏,尽管 getVisibility()
返回 8
:
before hide visibility: 0
setVisibility: 8
after hide visibility: 8
那么一般什么时候会发生这种情况? setVisibility
什么时候不调用 onVisibilityChanged
?
不要问我的具体情况是什么。但请提供可能发生这种情况的每一种一般情况。
最佳答案
setVisibility 的调用如下所示:
public void setVisibility(@Visibility int visibility) {
setFlags(visibility, VISIBILITY_MASK);
}
setFlags
方法很长,其中更改和处理了一堆不同的 View 属性,但值得注意的部分是:
if ((changed & VISIBILITY_MASK) != 0) {
// if visiblity changed...
...
if (mAttachInfo != null) { // true if attached in view hierarchy
dispatchVisibilityChanged(this, newVisibility); // onVisibilityChanged is called from here
...
因此,您将在未附加到 fragment 或 Activity 的 View 上看到您描述的行为。
关于android - setVisibility() 何时不会在 View 中触发 onVisibilityChanged()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52446653/
在帧可见性更改为 true 后如何调用某些方法? frame.setVisible(true); 我的应用程序有 2 个框架。如果我打开第二帧主框架隐藏。关闭第二个框架后,将显示主框架。所以,我想在主
我正在尝试使用 Javascript MutationObserver 获取有关元素状态变化的信息获取更改前元素的状态,然后检查当前状态,并据此做出一些决定。 基本上我正在尝试实现 onVisibil
我有一个问题,在特定情况下,当我在我的自定义 View 中调用 setVisibility(GONE) 时,它的 onVisibilityChanged 方法没有被调用,实际上它没有尽管 getVis
我是一名优秀的程序员,十分优秀!