日韩成人av网_麻豆国产va免费精品高清在线_在线一区二区视频_欧美三级不卡视频_国产精品久久久久久久久久精爆_亚洲最大av无码网站最新_久久国产免费视频_√天堂资源地址在线官网_黄色三级在线视频_日韩爱爱网_亚洲精品亚洲人成在线下载_免费视频爱爱太爽_a三级视频_亚洲精品无码国产片_男人的天堂国产在线视频_国精产品99永久一区一区_亚洲一二三视频_午夜免费福利视频_超清无码一区二区三区_国产高清中文手机在线观看

湘龍工作室提供長沙做網站,長沙建站,長沙網站開發,軟件制作,網站優化,域名注冊,網絡空間
長沙做網站

安卓開發監聽軟鍵盤的顯示狀態和獲取軟鍵盤的高度

發布時間:2015/11/28 來源:長沙做網站

 有時候在開發過程中需要監聽軟鍵盤的顯示狀態,在顯示和隱藏鍵盤時對UI做出相應的調整。Android官方沒有提供獲取軟鍵盤高度和狀態的方法,但是可以通過監聽當前應用的高度變化計算
 
出軟鍵盤的高度。
 
首先獲取到activity布局的最外層layout,通過調用getWindowVisibleDisplayFrame獲取到整個應用可以顯示的區域,這其中包括ActionBar和狀態欄,但不含設備底部的虛擬按鍵。
再通過調用getRootView().getHeight(),獲取整個屏幕的高度。同樣,這個高度也不含虛擬按鍵的高度。
 
通過比較這兩個高度,可以推斷出軟鍵盤是否顯示,并且獲取到軟鍵盤的高度。
 
需要注意的是,這種方法前提是軟鍵盤會影響界面布局,所以需要在AndroidManifest里給activity添加android:windowSoftInputMode="adjustResize"。
 
具體實現代碼如下:
private LinearLayout layout_main;
private TextView text;
 
// 狀態欄的高度
private int statusBarHeight;
// 軟鍵盤的高度
private int keyboardHeight;
// 軟鍵盤的顯示狀態
private boolean isShowKeyboard;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    statusBarHeight = getStatusBarHeight(getApplicationContext());
 
    text = (TextView) findViewById(R.id.text);
    layout_main = (LinearLayout) findViewById(R.id.layout_main);
 
    layout_main.getViewTreeObserver().addOnGlobalLayoutListener(globalLayoutListener);
}
 
private ViewTreeObserver.OnGlobalLayoutListener globalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
 
    @Override
    public void onGlobalLayout() {
        // 應用可以顯示的區域。此處包括應用占用的區域,
        // 以及ActionBar和狀態欄,但不含設備底部的虛擬按鍵。
        Rect r = new Rect();
        layout_main.getWindowVisibleDisplayFrame(r);
 
        // 屏幕高度。這個高度不含虛擬按鍵的高度
        int screenHeight = layout_main.getRootView().getHeight();
 
        int heightDiff = screenHeight - (r.bottom - r.top);
 
        // 在不顯示軟鍵盤時,heightDiff等于狀態欄的高度
        // 在顯示軟鍵盤時,heightDiff會變大,等于軟鍵盤加狀態欄的高度。
        // 所以heightDiff大于狀態欄高度時表示軟鍵盤出現了,
        // 這時可算出軟鍵盤的高度,即heightDiff減去狀態欄的高度
        if(keyboardHeight == 0 && heightDiff > statusBarHeight){
            keyboardHeight = heightDiff - statusBarHeight;
        }
 
        if (isShowKeyboard) {
            // 如果軟鍵盤是彈出的狀態,并且heightDiff小于等于狀態欄高度,
            // 說明這時軟鍵盤已經收起
            if (heightDiff <= statusBarHeight) {
                isShowKeyboard = false;
                onHideKeyboard();
            }
        } else {
            // 如果軟鍵盤是收起的狀態,并且heightDiff大于狀態欄高度,
            // 說明這時軟鍵盤已經彈出
            if (heightDiff > statusBarHeight) {
                isShowKeyboard = true;
                onShowKeyboard();
            }
        }
    }
};
 
private void onShowKeyboard() {
    // 在這里處理軟鍵盤彈出的回調
    text.setText("onShowKeyboard : keyboardHeight = " + keyboardHeight);
}
 
private void onHideKeyboard() {
    // 在這里處理軟鍵盤收回的回調
    text.setText("onHideKeyboard");
}
 
@Override
protected void onDestroy() {
    super.onDestroy();
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
        layout_main.getViewTreeObserver().removeGlobalOnLayoutListener(globalLayoutListener);
    } else {
        layout_main.getViewTreeObserver().removeOnGlobalLayoutListener(globalLayoutListener);
    }
}
 
// 獲取狀態欄高度
public static int getStatusBarHeight(Context context) {
    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());
        return context.getResources().getDimensionPixelSize(x);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return 0;
}
做網站版權所有 2009-2015 湘ICP備11020044號   sitemap
地址:長沙市天心區五一西路189號錦繡中環29樓(已搬至岳麓區金星北路89號)   郵編:410001
電話:0731-82067301   QQ:2668200050   Email:longyun1077@163.com
湘龍工作室為您提供:長沙做網站,長沙建站,長沙網站開發,軟件制作,網站優化,域名注冊,網絡空間服務
Copyright 2002-2010 長沙做網站www.ahshsu.cn. 版權所有
長沙做網站多少錢   長沙做網站公司   長沙做網站價格   長沙做網站的 培訓班管理軟件
分享到:
主站蜘蛛池模板: 祁门县| 蒙阴县| 松江区| 五华县| 和林格尔县| 中方县| 巴塘县| 阳朔县| 鹿邑县| 监利县| 中超| 略阳县| 汝城县| 高碑店市| 环江| 新干县| 昭觉县| 连南| 安泽县| 凯里市| 丰城市| 兴业县| 萨迦县| 师宗县| 揭西县| 博爱县| 淳安县| 桂林市| 英山县| 常熟市| 察隅县| 明水县| 五峰| 五指山市| 新安县| 卢龙县| 衡南县| 兴业县| 九龙县| 晋州市| 禄劝|