【发布时间】:2013-05-08 14:17:38
【问题描述】:
我在 android 中编写了一个自定义视图。当此视图的可见性发生更改时,我需要进行一些处理。当视图/小部件的可见性改变时,是否有一些监听器被调用?
编辑:
我知道如何改变可见性,想知道当我们在视图上设置可见性时是否有一个监听器被调用!
【问题讨论】:
-
请多解释一下
我在 android 中编写了一个自定义视图。当此视图的可见性发生更改时,我需要进行一些处理。当视图/小部件的可见性改变时,是否有一些监听器被调用?
编辑:
我知道如何改变可见性,想知道当我们在视图上设置可见性时是否有一个监听器被调用!
【问题讨论】:
您想在您的自定义视图类中进行该处理吗? 如果是这样,那为什么不直接重写 setVisibility() 方法,调用 super(),然后进行自定义处理呢?
【讨论】:
我知道如何更改可见性,想知道是否有 当我们在视图上设置可见性时调用的监听器!
您必须继承您的view/widget 并覆盖setVisibility,并注册一个您将在其上接收通知的接口。例如:
public class MyView extends View {
public interface MyListener {
public void onSetVisibilityCalled();
}
public void registerListener(MyListener myListener) {
this.mListener = myListener;
}
public void setVisibility (int visibility) {
super.setVisibility(visibility);
if (mListener != null)
mListener.onSetVisibilityCalled();
}
}
【讨论】:
您必须对要添加侦听器的视图进行子类化。然后您应该覆盖onVisibilityChanged 而不是setVisibility。 onVisibilityChanged 会在视图的可见性因任何原因发生更改时触发,包括更改祖先视图时。
如果您希望在您的View 的可见性发生变化时通知不同的类,您将需要一个接口。
例子:
public class MyView extends View {
private OnVisibilityChangedListener mVisibilityListener;
public interface OnVisibilityChangedListener {
// Avoid "onVisibilityChanged" name because it's a View method
public void visibilityChanged(int visibility);
}
public void setVisibilityListener(OnVisibilityChangedListener listener) {
this.mVisibilityListener = listener;
}
protected void onVisibilityChanged (View view, int visibility) {
super.onVisibilityChanged(view, visibility);
// if view == this then this view was directly changed.
// Otherwise, it was an ancestor that was changed.
// Notify external listener
if (mVisibilityListener != null)
mVisibilityListener.visibilityChanged(visibility);
// Now we can do some things of our own down here
// ...
}
}
【讨论】:
要更改小部件的可见性,请使用widget.setVisibility(View.Visible) 或widget.setVisibility(View.Invisible) 方法。
【讨论】: