首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 軟鍵盤彈出事件監聽最佳實踐:解決 ListView 被遮擋問題

     編輯:程式設計綜合問答

問題場景

聊天介面中 ListView 顯示消息,輸入框獲取焦點彈出軟鍵盤時,列表底部內容被鍵盤遮擋。需監聽鍵盤彈出事件,動態調整列表滾動或佈局高度。

核心難點

  • Android 無直接提供「鍵盤彈出/收起」的系統廣播或回調。
  • 監聽 EditText 焦點變化不可靠:代碼主動彈出鍵盤時,焦點獲取早於鍵盤動畫完成。

主流解決方案

方案一:監聽根視圖高度變化(推薦)

通過 ViewTreeObserver.OnGlobalLayoutListener 監聽根佈局可見高度變化,推斷鍵盤狀態。

final View rootView = findViewById(android.R.id.content);
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        Rect r = new Rect();
        rootView.getWindowVisibleDisplayFrame(r);
        int screenHeight = rootView.getRootView().getHeight();
        int keypadHeight = screenHeight - r.bottom;
        // 經驗值:鍵盤高度超過屏幕 1/3 視為彈出
        if (keypadHeight > screenHeight / 3) {
            // 鍵盤彈出:滾動 ListView 到最新消息、調整底部 padding 等
        } else {
            // 鍵盤收起:恢復佈局
        }
    }
});

方案二:使用成熟庫(如 KeyboardVisibilityEvent)

// build.gradle
implementation 'com.github.yshrsmz:KeyboardVisibilityEvent:2.1.0'

// 使用
KeyboardVisibilityEvent.setEventListener(this, new KeyboardVisibilityEventListener() {
    @Override
    public void onVisibilityChanged(boolean isOpen) {
        // 直接獲得鍵盤開關狀態
    }
});

方案三:設置 Window 軟鍵盤模式(簡單場景適用)

在 AndroidManifest.xml 對應 Activity 中設置:

<activity
    android:name=".ChatActivity"
    android:windowSoftInputMode="adjustResize|stateAlwaysHidden" />

adjustResize 會自動壓縮佈局高度,配合 ScrollView 或 RecyclerView 通常能解決遮擋問題,無需手動監聽。

最佳實踐建議

  1. 優先嘗試 adjustResize + RecyclerView(配合 LinearLayoutManager.setStackFromEnd(true))。
  2. 複雜佈局需精確控制時,使用方案一自定義監聽。
  3. 項目中統一接入方案二庫,封裝工具類供全局調用。
  4. 別忘記在 onDestroy 移除 OnGlobalLayoutListener 防止內存洩漏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved