如何处理自定义android视图/小部件的可见性更改

我已经在android中写了一个自定义视图。 当这个视图的可见性改变时,我需要做一些处理。 当视图/小部件的可见性改变时,是否有一些监听器被调用?

编辑:

我知道如何改变可见性,想知道是否有一个监听器,当我们在视图上设置可见性时被调用!

Solutions Collecting From Web of "如何处理自定义android视图/小部件的可见性更改"

你想在自定义视图类中进行处理吗? 如果是这样,那么为什么不直接重写setVisibility()方法,调用super(),然后进行自定义处理?

我知道如何改变可见性,想知道是否有一个监听器,当我们在视图上设置可见性时被调用!

您必须inheritance您的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)方法。