幸福なプログラマ

プログラマは幸福になれる。

ViewのVisibleが変化した際に起動するイベントリスナを作る。

1.イベントリスナをセットしたいViewを継承した独自Viewクラスを作成する。

public class MyTextView extends TextView {
    public MyTextView(Context context) {
        super(context, null);
    }
}

2.イベントリスナのインタフェース・メンバ変数・セットメソッドを定義する。

public class MyTextView extends TextView {
    public MyTextView(Context context) {
        super(context, null);
    }
    
    private OnVisibilityChangeListener mOnVisibilityChangeListener;
    public interface OnVisibilityChangeListener {
        public void onVisibilityChange(int visiblity);
    }
    public void setOnVisibilityChangeListener(OnVisibilityChangeListener listener) {
        mOnVisibilityChangeListener = listener;
    }
}

3.setVisiblityメソッドをオーバーライドしてVisibleの変化に呼応してイベントが発生するように実装する。

public class MyTextView extends TextView {
    public MyTextView(Context context) {
        super(context, null);
    }
    
    private OnVisibilityChangeListener mOnVisibilityChangeListener;
    public interface OnVisibilityChangeListener {
        public void onVisibilityChange(int visiblity);
    }
    public void setOnVisibilityChangeListener(OnVisibilityChangeListener listener) {
        mOnVisibilityChangeListener = listener;
    }
    
    @Override
    public void setVisibility(int visibility) {
        super.setVisibility(visibility);
        if (mOnVisibilityChangeListener != null) {
            mOnVisibilityChangeListener.onVisibilityChange(visibility);
        }
    }
}

これで対象のViewの表示・非表示が切り替わるたびに発生させたい処理を定義することができます。
 
ちなみに以下のように実装します。

mMyTextView.setOnVisibilityChangeListener(new MyTextView.OnVisibilityChangeListener() {
    @Override
    public void onVisibilityChange(int visiblity) {
        if (View.VISIBLE == visiblity) {
            
        } else if (View.INVISIBLE == visiblity) {
        
        } else if (View.GONE == visiblity) {
        
        }
    }
};