首页 > 解决方案 > setVisibility() 何时不会在视图中触发 onVisibilityChanged()?

问题描述

我有一个问题,在特定情况下,当我setVisibility(GONE)在自定义视图中调用时,它的onVisibilityChanged方法不会被调用,它实际上并没有隐藏视图,尽管之后getVisibility()返回8(或GONE)。

这是我知道可见性变化但未调用 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()会在日志中看到这些行:

隐藏可见性之前:0

onVisibilityChanged:8

设置可见性:8

隐藏可见度后:8

但是在特定情况下,当我打电话时,hide()我会在日志中看到这些行,尽管getVisibility()返回,但之后视图并没有隐藏8

隐藏可见性之前:0

设置可见性:8

隐藏可见度后:8

那么这种情况一般在什么时候发生呢?什么时候setVisibility不叫onVisibilityChanged

不要问我的具体情况是什么。但请提供可能发生这种情况的所有一般情况。

标签: android

解决方案


仅当视图附加到层次结构中时才调用它。

对 setVisibility 的调用如下所示:

public void setVisibility(@Visibility int visibility) {
    setFlags(visibility, VISIBILITY_MASK);
}

setFlags方法很长,其中更改和处理了一堆不同的视图属性,但值得注意的部分是:

 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 
            ...

因此,您将在未附加到片段或活动的视图上看到您描述的行为。


推荐阅读