Android開發之監聽軟鍵盤狀態(彈出收回)
概述
在我們開發過程中,有時需要監聽手機軟鍵盤狀態,但是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沒有這樣的API,所以需要我們自己處理。 實現方案 實現效果與原理 先上一張效果圖 可以看到我們準確的監聽到了軟鍵盤的彈出與收起事
Android 監聽軟鍵盤狀態
近日遇到要檢測軟鍵盤是否顯示或隱藏的問題,搜了一下網上,最後找到一個很簡單的,記錄一下。 activityRoot是activity的根view,就是xml裡面的第一個view,給它設定一個id. final View activityRootView = findView
Android開發之監聽發出的簡訊
為了監聽指定的ContentProvider的資料的改變,需要通過ContentResolver向指定Uri註冊CotentObserver監聽器。ContentResolver提供瞭如下方法來註冊監聽器: publicfinal void registerContentObserver(
Android開發之監聽或獲取手機簡訊內容
最近開始學習安卓,要做一個可以監聽手機簡訊的內容,做個筆記,方便以後檢視 有兩種方式: 方式一:通過廣播監聽簡訊資訊 註冊一個廣播接收器 <receiver android:name="接收器包名"> <intent-filte
Android開發之監聽手機來電
TelephonyManager是一個管理手機通話狀態、電話網路資訊的服務類,該類提供了大量的getXxx(),方法獲取電話網路的相關資訊。關於 程式執行結果: log_phone檔案: 應用例項: package com.jph.monitorphone;
Android開發 之 監聽返回鍵,彈出一個退出對話方塊
Android 如何監聽返回鍵點選事件,並建立一個退出對話方塊,防止自己寫的應用程式不小心點選退出鍵而直接退出。 自己記錄下這個簡單的demo,備用。 注:如下程式碼當時是從網上copy過來的,現在忘了它出自哪個原作者了,在此說聲抱歉。 原始碼如下: public
Android聊天介面監聽軟鍵盤彈出聊天記錄跟著頂上去
專案中做了個聊天介面,就一個介面懶得扒框架,順手擼了。 最後被提了個Bug,彈出輸入法鍵盤擋住了一部分聊天記錄,如下 看了微信就不會這樣,尋思是不是改改佈局就可以。 結果,一直以為是動態改變recyclerview的高度,配合佈局,把recyclerview頂上去。 各種
android 真正監聽軟鍵盤得彈起和收
在開發中我們有時需要監聽鍵盤得變化情況 Softkeyboardlistener.class 工具類 public class Softkeyboardlistener { private View rootView;//activity的根
Android實時監聽軟鍵盤顯示或隱藏
搞了一個實時監聽軟鍵盤顯示或隱藏,當軟鍵盤隱藏了,做邏輯;軟鍵盤顯示出來了,做邏輯; 直接上程式碼了,下面是我寫的工具類,名字為 SoftKeyBoardListener : import android.app.Activity; import android.graphics.
android 監聽軟鍵盤在頁面的展開和隱藏
獲取軟鍵盤狀態思路: 獲取當前頁面根佈局及其高度 RootH; 獲取狀態列高度 StatusH和導航欄高度 NavigationH; 獲取當前根檢視在螢幕上顯示的高度RectH; 高度差值比較,(根佈局高度 - 根檢視顯示高度)與(狀態列高度 + 導航欄高度)的大小對
Android App監聽軟鍵盤按鍵的三種方式
前言: 我們在android手機上面有時候會遇到監聽手機軟鍵盤按鍵的時候,例如:我們在瀏覽器輸入url完畢後可以點選軟鍵盤右下角的“GO”按鍵載入url頁面;在點選搜尋框的時候,點選右下角的search符號鍵可以進行搜尋;或者在全部資料輸入完畢後,點選右下角的"done"
Android 監聽軟鍵盤按鍵與改變軟鍵盤右下角按鍵樣式
android:singleline=”true” android:imeoptions=”actionSearch” 一定要加singleline=”true”!!! actionN
Android App監聽軟鍵盤按鍵的三種方式與改變軟鍵盤右下角確定鍵樣式
actionNone : 回車鍵,按下後游標到下一行actionGo : Go,actionSearch : 放大鏡actionSend : SendactionNext : Nextacti
Android監聽軟鍵盤開啟收起事件
一:瞭解軟鍵盤上各類鍵名: 電話鍵 鍵名 描述 鍵值 KEYCODE_CALL 撥號鍵 5 KEYCODE_ENDCALL 掛機鍵 6 KEYCODE_HOME 按鍵Home 3 KEYCODE_MENU 選單鍵 82 KE
Android 類似淘寶 電商 搜尋功能,監聽軟鍵盤搜尋事件,延遲自動搜尋,以及時間排序的搜尋歷史記錄的實現
最近跳槽去新公司,接受的第一個任務是在 一個電商模組的搜尋功能以及搜尋歷史記錄的實現。 需求和淘寶等電商的功能大體差不多,最上面一個搜尋框,下面顯示搜尋歷史記錄。在EditText裡輸入要搜尋的關鍵字後,按軟鍵盤的搜尋按鍵/延遲xxxxms後自動搜尋。然後將搜尋的內容展示給
android監聽軟鍵盤迴車鍵並且解決預設點選兩次的問題
@Override public boolean dispatchKeyEvent(KeyEvent event) { if(event.getKeyCode()==KeyEvent.KEYCODE_ENTER&&event.getActio
Android在Fragment中監聽軟鍵盤的彈出和關閉
原理是通過根佈局與當前佈局高度差來判斷的,Fragment實現ViewTreeObserver.OnGlobalLayoutListener這個介面。 @Override public void onGlobalLayout() {
Android監聽軟鍵盤迴車事件
在Android開發中,難免會碰到一些”意外“。比如輸入法軟按鍵監聽問題,因為第三方輸入法各有不同(對一些按鍵事件作了一些特殊的處理),所以有時有些程式碼會“失靈”。假設一個場景,EditText監聽回車事件,回車後就傳送輸入的內容,一般有以下4種處理方式: 假設場景圖:
Android專案類似淘寶 電商 搜尋功能,監聽軟鍵盤搜尋事件,延遲自動搜尋,以及時間排序的搜尋歷史記錄的實現
最近跳槽去新公司,接受的第一個任務是在 一個電商模組的搜尋功能以及搜尋歷史記錄的實現。 需求和淘寶等電商的功能大體差不多,最上面一個搜尋框,下面顯示搜尋歷史記錄。在EditText裡輸入要搜尋的關鍵字後,按軟鍵盤的搜尋按鍵/延遲xxxxms後自動搜尋。然後將搜尋
Android監聽軟鍵盤開啟收起事件(軟鍵盤自帶收起按鈕)
最近在公司開發cocos2dx上的Android輸入框控制元件,遇到軟鍵盤的事件監聽,通常軟鍵盤的收起方式大致3種: 1.點選軟鍵盤右下角的Return按鈕(系統收起) 2.輸入框焦點時按返回按鈕(系統收起) 3.點選軟鍵盤和輸入框的外部(自發收起) 4.點選軟