diff --git a/KeyboardUtils.java b/KeyboardUtils.java index 017a190..ebf7d7d 100644 --- a/KeyboardUtils.java +++ b/KeyboardUtils.java @@ -13,46 +13,44 @@ * Based on the following Stackoverflow answer: * http://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android */ -public class KeyboardUtils implements ViewTreeObserver.OnGlobalLayoutListener -{ +public class KeyboardUtils implements ViewTreeObserver.OnGlobalLayoutListener { private final static int MAGIC_NUMBER = 200; private SoftKeyboardToggleListener mCallback; private View mRootView; + private Boolean prevValue = null; private float mScreenDensity = 1; private static HashMap sListenerMap = new HashMap<>(); - public interface SoftKeyboardToggleListener - { + public interface SoftKeyboardToggleListener { void onToggleSoftKeyboard(boolean isVisible); } @Override - public void onGlobalLayout() - { + public void onGlobalLayout() { Rect r = new Rect(); mRootView.getWindowVisibleDisplayFrame(r); int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top); - float dp = heightDiff/ mScreenDensity; + float dp = heightDiff / mScreenDensity; + boolean isVisible = dp > MAGIC_NUMBER; - if(mCallback != null) - mCallback.onToggleSoftKeyboard(dp > MAGIC_NUMBER); + if (mCallback != null && (prevValue == null || isVisible != prevValue)) { + prevValue = isVisible; + mCallback.onToggleSoftKeyboard(isVisible); + } } - public static void addKeyboardToggleListener(Activity act, SoftKeyboardToggleListener listener) - { + public static void addKeyboardToggleListener(Activity act, SoftKeyboardToggleListener listener) { removeKeyboardToggleListener(listener); sListenerMap.put(listener, new KeyboardUtils(act, listener)); } - public static void removeKeyboardToggleListener(SoftKeyboardToggleListener listener) - { - if(sListenerMap.containsKey(listener)) - { + public static void removeKeyboardToggleListener(SoftKeyboardToggleListener listener) { + if (sListenerMap.containsKey(listener)) { KeyboardUtils k = sListenerMap.get(listener); k.removeListener(); @@ -60,39 +58,37 @@ public static void removeKeyboardToggleListener(SoftKeyboardToggleListener liste } } - public static void removeAllKeyboardToggleListeners() - { - for(SoftKeyboardToggleListener l : sListenerMap.keySet()) + public static void removeAllKeyboardToggleListeners() { + for (SoftKeyboardToggleListener l : sListenerMap.keySet()) sListenerMap.get(l).removeListener(); sListenerMap.clear(); } - public static void toggleKeyboardVisibility(Context context) - { + public static void toggleKeyboardVisibility(Context context) { InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); } /** * Closes the keyboard + * * @param activeView the view with the keyboard focus */ - public static void forceCloseKeyboard(View activeView) - { + public static void forceCloseKeyboard(View activeView) { InputMethodManager inputMethodManager = (InputMethodManager) activeView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(activeView.getWindowToken(), 0); } - private void removeListener() - { + private void removeListener() { mCallback = null; - mRootView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + mRootView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } } - private KeyboardUtils(Activity act, SoftKeyboardToggleListener listener) - { + private KeyboardUtils(Activity act, SoftKeyboardToggleListener listener) { mCallback = listener; mRootView = ((ViewGroup) act.findViewById(android.R.id.content)).getChildAt(0);