1. 程式人生 > >Android開發之監聽軟鍵盤狀態(彈出收回)

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.點選軟