殆ど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などがあった場合など想定していないタイミングで発火してしまう。