15

Androidでカスタムビューを作成しました。このビューの可視性が変更されたときに、何らかの処理を行う必要があります。ビュー/ウィジェットの可視性が変更されたときに呼び出されるリスナーはありますか?

編集:

可視性を変更する方法を知っています。ビューに setVisibility を設定したときに呼び出されるリスナーがあるかどうかを知りたいです!

4

4 に答える 4

18

カスタム ビュー クラス内でその処理を行いますか? もしそうなら、setVisibility() メソッドをオーバーライドし、super() を呼び出してから、カスタム処理を実行してみませんか?

于 2013-05-08T14:30:27.333 に答える
17

可視性を変更する方法を知っています。ビューに setVisibility を設定したときに呼び出されるリスナーがあるかどうかを知りたいです!

あなた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();
 }

}
于 2013-05-08T14:37:16.300 に答える
13

リスナーを追加するビューをサブクラス化する必要があります。onVisibilityChanged次に、の代わりにオーバーライドする必要がありますsetVisibilityonVisibilityChanged祖先ビューが変更されたときなど、何らかの理由でビューの可視性が変更されたときにトリガーされます。

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
   // ...
 }
}
于 2015-03-19T17:01:43.650 に答える
-1

ウィジェットの可視性を変更するには、widget.setVisibility(View.Visible)またはwidget.setVisibility(View.Invisible)メソッドを使用します。

于 2013-05-08T14:19:33.153 に答える