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

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

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

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

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");
    }
});

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

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