何时在视图中setVisibility()不触发onVisibilityChanged()?

ROA*_*OAR 5 android

我遇到一个问题,在特定情况下,当我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());
}
Run Code Online (Sandbox Code Playgroud)

通常,当我打电话时,我会hide()在日志中看到以下几行:

隐藏前可见度:0

onVisibilityChanged:8

setVisibility:8

隐藏后可见度:8

但是在一个特殊的情况下,当我打电话时,我hide()在日志中得到了这些行,尽管getVisibility()返回了8

隐藏前可见度:0

setVisibility:8

隐藏后可见度:8

那么,通常何时会发生这种情况?什么时候setVisibility不打电话onVisibilityChanged

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

Rob*_*bCo 4

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

对 setVisibility 的调用如下所示:

public void setVisibility(@Visibility int visibility) {
    setFlags(visibility, VISIBILITY_MASK);
}
Run Code Online (Sandbox Code Playgroud)

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 
            ...
Run Code Online (Sandbox Code Playgroud)

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