【发布时间】:2015-12-23 00:22:33
【问题描述】:
有没有办法在不覆盖视图的情况下处理视图可见性更改(例如,从 GONE 到 VISIBLE)?
类似View.setOnVisibilityChangeListener();?
【问题讨论】:
-
我不确定,但我想说没有这样的事情,因为它会在整个系统上投入大量工作来永久跟踪所有视图的可见性时间,以便通知可能的侦听器。
标签: android
有没有办法在不覆盖视图的情况下处理视图可见性更改(例如,从 GONE 到 VISIBLE)?
类似View.setOnVisibilityChangeListener();?
【问题讨论】:
标签: android
您可以使用GlobalLayoutListener 来确定视图可见性是否有任何变化。
myView.setTag(myView.getVisibility());
myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int newVis = myView.getVisibility();
if((int)myView.getTag() != newVis)
{
myView.setTag(myView.getVisibility());
//visibility has changed
}
}
});
【讨论】:
您可以使用装饰来代替子类化:
class WatchedView {
static class Listener {
void onVisibilityChanged(int visibility);
}
private View v;
private Listener listener;
WatchedView(View v) {
this.v = v;
}
void setListener(Listener l) {
this.listener = l;
}
public setVisibility(int visibility) {
v.setVisibility(visibility);
if(listener != null) {
listener.onVisibilityChanged(visibility);
}
}
}
然后
WatchedView v = new WatchedView(findViewById(R.id.myview));
v.setListener(this);
【讨论】:
setVisibility()
看看ViewTreeObserver.OnGlobalLayoutListener。如文档中所述,当全局布局状态或视图树中视图的可见性发生变化时,将调用其回调方法onGlobalLayout()。因此,您可以尝试使用它来检测视图可见性何时发生变化。
【讨论】:
如果有人需要,Kotlin 似乎要容易得多。如果您需要跟踪来自 from 的不可见,则使用与接受的答案类似的方法也可以工作(设置标签),但我将其用于 GONE -> VISIBLE -> GONE
binding.myView.viewTreeObserver.addOnGlobalLayoutListener {
when (binding.myView.visibility) {
View.VISIBLE -> {
}
View.GONE -> {
}
}
}
【讨论】: