Android開發之監聽軟鍵盤狀態(彈出收回)
版權申明】非商業目的註明出處可自由轉載
博文地址:https://blog.csdn.net/ShuSheng0007/article/details/81511764
出自:shusheng007
概述
在我們開發過程中,有時需要監聽手機軟鍵盤狀態,但是Android沒有這樣的API,所以需要我們自己處理。
實現方案
實現效果與原理
先上一張效果圖
可以看到我們準確的監聽到了軟鍵盤的彈出與收起事件
首先我們應該思考,從鍵盤彈出與隱藏這個動作中我們可以獲得什麼有用的資訊呢?我們的View
佈局在此過程中有可能發生變化,如果我們可以監聽到這個變化,而且判定是由於軟鍵盤造成的就OK了。
具體程式碼
下面就是按照上面的思路寫出的程式碼,具體分析在程式碼後面:
public class KeyboardStateObserver {
private static final String TAG = KeyboardStateObserver.class.getSimpleName();
public static KeyboardStateObserver getKeyboardStateObserver(Activity activity) {
return new KeyboardStateObserver(activity);
}
private View mChildOfContent;
private int usableHeightPrevious;
private OnKeyboardVisibilityListener listener;
public void setKeyboardVisibilityListener(OnKeyboardVisibilityListener listener) {
this.listener = listener;
}
private KeyboardStateObserver(Activity activity) {
FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
mChildOfContent = content.getChildAt(0);
mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
possiblyResizeChildOfContent();
}
});
}
private void possiblyResizeChildOfContent() {
int usableHeightNow = computeUsableHeight();
if (usableHeightNow != usableHeightPrevious) {
int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
int heightDifference = usableHeightSansKeyboard - usableHeightNow;
if (heightDifference > (usableHeightSansKeyboard / 4)) {
if (listener != null) {
listener.onKeyboardShow();
}
} else {
if (listener != null) {
listener.onKeyboardHide();
}
}
usableHeightPrevious = usableHeightNow;
Log.d(TAG,"usableHeightNow: " + usableHeightNow + " | usableHeightSansKeyboard:" + usableHeightSansKeyboard + " | heightDifference:" + heightDifference);
}
}
private int computeUsableHeight() {
Rect r = new Rect();
mChildOfContent.getWindowVisibleDisplayFrame(r);
Log.d(TAG,"rec bottom>" + r.bottom + " | rec top>" + r.top);
return (r.bottom - r.top);// 全屏模式下: return r.bottom
}
public interface OnKeyboardVisibilityListener {
void onKeyboardShow();
void onKeyboardHide();
}
}
上面的程式碼主要乾了這幾件事情:
1:我們獲取到了設定到Activity
頁面裡面的View
佈局mChildOfContent
,這個就是我們在Layout檔案中定義的View
。
2:通過mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener
為其設定一個佈局變化監聽,只要佈局有任何變化,都會觸發這個監聽。例如顯示或隱藏某個view
,由於輸入使某個editview
高度變化等。
3:計算佈局變化的高度,如果變化的高度大於佈局有效高度的1/4,我們認為這個佈局變化是由軟鍵盤造成的。
4:觸發鍵盤顯示與隱藏的監聽。
如何使用
使用非常簡單,獲取例項,設定監聽,在回撥中處理邏輯即可。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
KeyboardStateObserver.getKeyboardStateObserver(this).
setKeyboardVisibilityListener(new KeyboardStateObserver.OnKeyboardVisibilityListener() {
@Override
public void onKeyboardShow() {
Toast.makeText(MainActivity.this,"鍵盤彈出",Toast.LENGTH_SHORT).show();
}
@Override
public void onKeyboardHide() {
Toast.makeText(MainActivity.this,"鍵盤收回",Toast.LENGTH_SHORT).show();
}
});
}
note:此方式必須在彈出鍵盤時候,使頁面原有佈局發生變動,所以如果不起作用的話可以試著在AndroidManifest.xml檔案中設定android:windowSoftInputMode=”adjustResize|stateHidden“”
隱患
由於我們設定為佈局變動大於有效高度1/4就認為是由軟鍵盤引起的,當遇到鍵盤高度小於1/4,或者佈局由於設計原因會有高度變化大於1/4時都會出問題,但是這些情況都是極其罕見的。
相關文章
- Android監聽軟鍵盤收起與彈出Android
- android開發中,監聽軟鍵盤的狀態(收起或者開啟)Android
- Android 監聽鍵盤彈出收起Android
- Android 監聽鍵盤狀態變化,並獲取鍵盤高度Android
- 監聽Android軟體盤彈出及隱藏Android
- Android 監聽鍵盤彈起及隱藏Android
- 阻止android軟鍵盤自動彈出Android
- ios pop介面 鍵盤彈起又收回iOS
- h5監聽手機鍵盤彈起H5
- java鍵盤監聽之視窗監聽的實現Java
- 監聽鍵盤事件事件
- h5鍵盤彈出收回導致位置錯亂解決方案H5
- 鍵盤監聽事件--向左事件
- javascript監聽鍵盤事件JavaScript事件
- python pynput監聽鍵盤Python
- Android中的EditText預設時不彈出軟鍵盤的方法Android
- java全域性滑鼠鍵盤監聽Java
- 關於Android中軟鍵盤顯示隱藏的監聽判斷總結Android
- Android Home鍵監聽Android
- iOS AFN監聽網路狀態iOS
- android設定軟鍵盤搜尋鍵以及監聽搜尋鍵點選時發生兩次事件的問題解決Android事件
- 短視訊平臺開發,點選輸入框時自動彈出軟鍵盤
- android實現底部彈出框與軟鍵盤衝突(全面屏虛擬鍵適配)Android
- Android 掃碼槍輸入時遮蔽軟鍵盤和頂部狀態列Android
- iOS-OC-監聽藍芽是否開啟(開啟狀態)iOS藍芽
- Android Home鍵、鎖屏鍵監聽Android
- iOS 使用 Reachability 監聽網路狀態iOS
- Android軟鍵盤彈出,覆蓋h5頁面輸入框問題AndroidH5
- vue的監聽鍵盤事件的快捷方法Vue事件
- Java中的鍵盤監聽事件KeyListenerJava事件
- Android軟鍵盤模式Android模式
- 動態監聽與靜態監聽
- 動態監聽和靜態監聽
- 電腦軟鍵盤怎麼開啟 快速調出軟鍵盤的方法教程
- android PopupWindow監聽返回鍵無效Android
- Android開發,在Fragment中,隱藏或關閉軟鍵盤(虛擬鍵盤)的方法AndroidFragment
- Flutter_Webview 鍵盤彈出問題FlutterWebView
- 監聽狀態正常,但是資料庫不能連線,提示沒有監聽....資料庫