android - 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
?
不要问我的具体情况是什么。但请提供可能发生这种情况的所有一般情况。
解决方案
仅当视图附加到层次结构中时才调用它。
对 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
...
因此,您将在未附加到片段或活动的视图上看到您描述的行为。
推荐阅读
- amazon-cloudwatch - Amazon Cloudwatch Logs Insights 可以访问 json 字段吗?
- mysql - 像查询 JPA 中枚举类型的列
- python - 如何在不重写的情况下更新文本文件
- arrays - 有没有办法对这种数组进行排序?
- vba - MS Access:CurrentDb.OpenRecordset 返回多个值
- c - C中的链表仅显示最后2个元素
- excel - Excel 使用图形趋势线公式从 x 值计算 y 值
- javascript - .getDay() 在将日期转换为特定时区时不起作用
- python - 在 Debian 10 上安装 python-pcl:libpcl_keypoints 导入错误
- css - 下拉菜单显示在导航栏中