[ Android ] ソフトキーボード表示、非表示イベント

Androidではソフトキーボードの表示、非表示イベントは用意されていないため、独自で実装する必要がある。

・stackoverflowにいい方法があったので紹介

I would like to alter the layout based on whether the virtual keyboard is shown or not. I've searched the API and various blogs but can't seem to find anything ...

(真ん中あたり、一番上の回答では出来ないみたい)

WebView上でキーボード表示時に利用しています。

・interfaceの宣言

public interface OnKeyboardVisibilityListener {
    void onVisibilityChanged(boolean visible);
}

・表示/非表示の監視

private void setKeyboardVisibilityListener(final OnKeyboardVisibilityListener onKeyboardVisibilityListener) {
    final View parentView = ((ViewGroup)currentView.findViewById(R.id.webview));//.getChildAt(0);
    parentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        private boolean alreadyOpen;
        private final int defaultKeyboardHeightDP = 100;
        private final int EstimatedKeyboardDP = defaultKeyboardHeightDP + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 48 : 0);
        private final Rect rect = new Rect();
        @Override
        public void onGlobalLayout() {
            int estimatedKeyboardHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, EstimatedKeyboardDP, parentView.getResources().getDisplayMetrics());
            parentView.getWindowVisibleDisplayFrame(rect);
            int heightDiff = parentView.getRootView().getHeight() - (rect.bottom - rect.top);
            boolean isShown = heightDiff >= estimatedKeyboardHeight;
            if (isShown == alreadyOpen) {
                Log.i("Keyboard state", "Ignoring global layout change...");
                return;
            }
            alreadyOpen = isShown;
            onKeyboardVisibilityListener.onVisibilityChanged(isShown);
        }
    });
}

final View parentView = ((ViewGroup)currentView.findViewById(R.id.webview));//.getChildAt(0);

※ この部分は自分にあったViewにする必要がある

・使い方

setKeyboardVisibilityListener(new OnKeyboardVisibilityListener() {
    @Override
    public void onVisibilityChanged(boolean visible) {
        Log.i("Keyboard state", visible ? "Keyboard is active" : "Keyboard is Inactive");
    }
});

表示/非表示でイベントが発生してます。

いい回答が埋もれているのは勿体無い気がします。