Created
January 21, 2019 16:55
-
-
Save isaiastavares/c9f3444e42416d05cc0c2a51f348314b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package yourpackage; | |
import android.app.Activity; | |
import android.graphics.Rect; | |
import android.view.View; | |
import android.view.ViewGroup; | |
import android.view.ViewTreeObserver; | |
import android.content.Context; | |
import android.view.inputmethod.InputMethodManager; | |
import java.util.HashMap; | |
/** | |
* Based on the following Stackoverflow answer: | |
* http://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android | |
*/ | |
@SuppressWarnings("WeakerAccess") | |
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; | |
private static HashMap<SoftKeyboardToggleListener, KeyboardUtils> sListenerMap = new HashMap<>(); | |
public interface SoftKeyboardToggleListener { | |
void onToggleSoftKeyboard(boolean isVisible); | |
} | |
@Override | |
public void onGlobalLayout() { | |
Rect r = new Rect(); | |
mRootView.getWindowVisibleDisplayFrame(r); | |
int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top); | |
float dp = heightDiff / mScreenDensity; | |
boolean isVisible = dp > MAGIC_NUMBER; | |
if (mCallback != null && (prevValue == null || isVisible != prevValue)) { | |
prevValue = isVisible; | |
mCallback.onToggleSoftKeyboard(isVisible); | |
} | |
} | |
/** | |
* Add a new keyboard listener | |
* | |
* @param act calling activity | |
* @param listener callback | |
*/ | |
public static void addKeyboardToggleListener(Activity act, SoftKeyboardToggleListener listener) { | |
removeKeyboardToggleListener(listener); | |
sListenerMap.put(listener, new KeyboardUtils(act, listener)); | |
} | |
/** | |
* Remove a registered listener | |
* | |
* @param listener {@link SoftKeyboardToggleListener} | |
*/ | |
public static void removeKeyboardToggleListener(SoftKeyboardToggleListener listener) { | |
if (sListenerMap.containsKey(listener)) { | |
KeyboardUtils k = sListenerMap.get(listener); | |
k.removeListener(); | |
sListenerMap.remove(listener); | |
} | |
} | |
/** | |
* Remove all registered keyboard listeners | |
*/ | |
public static void removeAllKeyboardToggleListeners() { | |
for (SoftKeyboardToggleListener l : sListenerMap.keySet()) { | |
sListenerMap.get(l).removeListener(); | |
} | |
sListenerMap.clear(); | |
} | |
/** | |
* Manually toggle soft keyboard visibility | |
* | |
* @param context calling context | |
*/ | |
public static void toggleKeyboardVisibility(Context context) { | |
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); | |
if (inputMethodManager != null) { | |
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); | |
} | |
} | |
/** | |
* Force closes the soft keyboard | |
* | |
* @param activeView the view with the keyboard focus | |
*/ | |
public static void forceCloseKeyboard(View activeView) { | |
InputMethodManager inputMethodManager = (InputMethodManager) activeView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); | |
if (inputMethodManager != null) { | |
inputMethodManager.hideSoftInputFromWindow(activeView.getWindowToken(), 0); | |
} | |
} | |
private void removeListener() { | |
mCallback = null; | |
mRootView.getViewTreeObserver().removeOnGlobalLayoutListener(this); | |
} | |
private KeyboardUtils(Activity act, SoftKeyboardToggleListener listener) { | |
mCallback = listener; | |
mRootView = ((ViewGroup) act.findViewById(android.R.id.content)).getChildAt(0); | |
mRootView.getViewTreeObserver().addOnGlobalLayoutListener(this); | |
mScreenDensity = act.getResources().getDisplayMetrics().density; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment