在最近的项目遇到软键盘弹出关闭的问题困扰了好久,看到大神写的通过界面高度的变化,判断软键盘的状态,在大神代码的基础上做了改动,基本能实现想要的效果。
import android.app.Activity;
import android.os.Build;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowManager;
import java.lang.ref.WeakReference;
/**
* ********************************************************
* 对软键盘打开关闭的监听
* ********************************************************
* Created by wangdong on 16/7/12.
*/
public class KeyboardWatcher {
private WeakReference<Activity> activityRef;
private WeakReference<View> rootViewRef;
private WeakReference<OnKeyboardToggleListener> onKeyboardToggleListenerRef;
private ViewTreeObserver.OnGlobalLayoutListener viewTreeObserverListener;
public KeyboardWatcher(Activity activity) {
activityRef = new WeakReference<>(activity);
initialize();
}
public void setListener(OnKeyboardToggleListener onKeyboardToggleListener) {
onKeyboardToggleListenerRef = new WeakReference<>(onKeyboardToggleListener);
}
public void destroy() {
if (rootViewRef.get() != null)
if (Build.VERSION.SDK_INT >= 16) {
rootViewRef.get().getViewTreeObserver().removeOnGlobalLayoutListener(viewTreeObserverListener);
} else {
rootViewRef.get().getViewTreeObserver().removeGlobalOnLayoutListener(viewTreeObserverListener);
}
}
private void initialize() {
if (hasAdjustResizeInputMode()) {
viewTreeObserverListener = new GlobalLayoutListener();
rootViewRef = new WeakReference<>(activityRef.get().findViewById(Window.ID_ANDROID_CONTENT));
rootViewRef.get().getViewTreeObserver().addOnGlobalLayoutListener(viewTreeObserverListener);
} else {
throw new IllegalArgumentException(String.format("Activity %s should have windowSoftInputMode=\"adjustResize\"" +
"to make KeyboardWatcher working. You can set it in AndroidManifest.xml", activityRef.get().getClass().getSimpleName()));
}
}
private boolean hasAdjustResizeInputMode() {
return (activityRef.get().getWindow().getAttributes().softInputMode & WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) != 0;
}
private class GlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
int initialValue;
boolean hasSentInitialAction;
boolean isKeyboardShown;
@Override
public void onGlobalLayout() {
if (initialValue == 0) {
initialValue = rootViewRef.get().getHeight();
} else {
if (initialValue > rootViewRef.get().getHeight()) {
if (onKeyboardToggleListenerRef.get() != null) {
if (!hasSentInitialAction || !isKeyboardShown) {
isKeyboardShown = true;
onKeyboardToggleListenerRef.get().onKeyboardShown(initialValue - rootViewRef.get().getHeight());
}
}
} else {
if (!hasSentInitialAction || isKeyboardShown) {
isKeyboardShown = false;
rootViewRef.get().post(new Runnable() {
@Override
public void run() {
if (onKeyboardToggleListenerRef.get() != null) {
onKeyboardToggleListenerRef.get().onKeyboardClosed();
}
}
});
}
}
hasSentInitialAction = true;
}
}
}
public interface OnKeyboardToggleListener {
void onKeyboardShown(int keyboardSize);
void onKeyboardClosed();
}
}
使用方法:
在AndroidManifest.xml中
<activity
android:name=".MainActivity"
android:windowSoftInputMode="adjustResize" />
在Activity中
KeyboardWatcher keyboardWatcher = new KeyboardWatcher(this);
keyboardWatcher.setListener(new KeyboardWatcher.OnKeyboardToggleListener() {
@Override
public void onKeyboardShown(int keyboardSize) {
//处理软键盘弹出
}
@Override
public void onKeyboardClosed() {
//处理软键盘关闭
}
});