gpt4 book ai didi

android - setVisibility() 何时不会在 View 中触发 onVisibilityChanged()?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:00:08 27 4
gpt4 key购买 nike

我有一个问题,在特定情况下,当我在我的自定义 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

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

最佳答案

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com