最近在項目中,須要獲取到軟鍵盤的高度,再將底部的佈局上移鍵盤的高度,話很少說,直接上代碼:android
獲取軟鍵盤高度bash
//一個靜態變量存儲高度
public static int keyboardHeight = 0;
boolean isVisiableForLast = false;
ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = null;
public void addOnSoftKeyBoardVisibleListener() {
if (keyboardHeight > 0) {
return;
}
final View decorView = getWindow().getDecorView();
onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
decorView.getWindowVisibleDisplayFrame(rect);
//計算出可見屏幕的高度
int displayHight = rect.bottom - rect.top;
//得到屏幕總體的高度
int hight = decorView.getHeight();
boolean visible = (double) displayHight / hight < 0.8;
int statusBarHeight = 0;
try {
Class<?> c = Class.forName("com.android.internal.R$dimen");
Object obj = c.newInstance();
Field field = c.getField("status_bar_height");
int x = Integer.parseInt(field.get(obj).toString());
statusBarHeight = getApplicationContext().getResources().getDimensionPixelSize(x);
} catch (Exception e) {
e.printStackTrace();
}
if (visible && visible != isVisiableForLast) {
//得到鍵盤高度
keyboardHeight = hight - displayHight - statusBarHeight;
Log.i("keyboardHeight==1213==", "" + keyboardHeight);
}
isVisiableForLast = visible;
}
};
decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
}
複製代碼
鍵盤的打開與關閉操做:ide
public class KeybordS {
/**
* 打開軟鍵盤
*/
public static void openKeybord(EditText mEditText, Context mContext) {
mEditText.setFocusable(true);
mEditText.setFocusableInTouchMode(true);
mEditText.requestFocus();
InputMethodManager imm = (InputMethodManager) mContext
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mEditText, InputMethodManager.RESULT_SHOWN);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,
InputMethodManager.HIDE_IMPLICIT_ONLY);
}
/**
* 關閉軟鍵盤
*/
public static void closeKeybord(EditText mEditText, Context mContext) {
InputMethodManager imm = (InputMethodManager) mContext
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
}
/**
* 關閉軟鍵盤
*/
public static void hideInput(Activity activity) {
if (activity.getCurrentFocus() != null) {
InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
}
/**
* 判斷當前軟鍵盤是否打開
*/
public static boolean isSoftInputShow(Activity activity) {
// 虛擬鍵盤隱藏 判斷view是否爲空
View view = activity.getWindow().peekDecorView();
if (view != null) {
// 隱藏虛擬鍵盤
InputMethodManager inputmanger = (InputMethodManager) activity
.getSystemService(Activity.INPUT_METHOD_SERVICE);
// inputmanger.hideSoftInputFromWindow(view.getWindowToken(),0);
return inputmanger.isActive() && activity.getWindow().getCurrentFocus() != null;
}
return false;
}
}
複製代碼
監聽鍵盤處於打開仍是關閉狀態:佈局
private void setListenerToRootView() {
final View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
boolean mKeyboardUp = isKeyboardShown(rootView);
if (mKeyboardUp) {
//鍵盤彈出
//Toast.makeText(getApplicationContext(), "鍵盤彈出", Toast.LENGTH_SHORT).show();
} else {
//鍵盤收起
//Toast.makeText(getApplicationContext(), "鍵盤收起", Toast.LENGTH_SHORT).show();
}
}
});
}
private boolean isKeyboardShown(View rootView) {
final int softKeyboardHeight = 100;
Rect r = new Rect();
rootView.getWindowVisibleDisplayFrame(r);
DisplayMetrics dm = rootView.getResources().getDisplayMetrics();
int heightDiff = rootView.getBottom() - r.bottom;
return heightDiff > softKeyboardHeight * dm.density;
}
複製代碼
如下是我的公衆號(longxuanzhigu),以後發佈的文章會同步到該公衆號,方便交流學習Android知識及分享我的愛好文章: 學習