我遇到一个问题,在特定情况下,当我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?
不要问我的具体情况是什么。但是请提供所有可能发生这种情况的一般情况。
对 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)
因此,您将在未附加到片段或活动的视图上看到您所描述的行为。
| 归档时间: |
|
| 查看次数: |
374 次 |
| 最近记录: |