@blog.justoneplanet.info

日々勉強

AndroidでViewがResizeされたのを検知する

殆どstackoverflowのコードと同様だがlistenerに発火する条件だけ変更した。

public class DetectableResizedLinearLayout extends LinearLayout {
    private OnResizedListener mListener;

    public DetectableResizedLinearLayout(Context context) {
        super(context);
    }
    public DetectableResizedLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public DetectableResizedLinearLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    
    public void setOnSoftKeyShownListener(OnResizedListener listener) {
        mListener = listener;
    }
    
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (mListener != null) {
            final int newSpec = MeasureSpec.getSize(heightMeasureSpec); 
            final int oldSpec = getMeasuredHeight();
            if (oldSpec > newSpec + oldSpec / 4){
                mListener.onContracted();
            }
            else if (oldSpec + newSpec / 4 < newSpec) {
                mListener.onExpanded();
            }
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
    
    public interface OnResizedListener {
        public void onContracted();
        public void onExpanded();
    }
}

上述のようにしないと非同期で画像を読み込むViewなどがあった場合など想定していないタイミングで発火してしまう。

参考

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment