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

Jee*_*van 11 android view

我在android中编写了一个自定义视图.当更改此视图的可见性时,我需要进行一些处理.当视图/窗口小部件的可见性发生变化时,是否会调用一些侦听器?

编辑:

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

use*_*075 17

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

  • 它不会这样工作.例如,如果将视图的父级设置为不可见,则该视图的可见性属性仍然可见.只是练习这个,你会发现它是真的. (3认同)

Bla*_*elt 15

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

你必须继承你的子类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();
 }

}
Run Code Online (Sandbox Code Playgroud)


Wil*_*iam 10

您必须将要添加侦听器的视图子类化.然后你应该覆盖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
   // ...
 }
}
Run Code Online (Sandbox Code Playgroud)