国产亚洲精品久久久久的角色-日韩欧美三级-久久精品爱-色一情一狱一爱一乱-亚洲国产欧美在线观看-极品美女扒开粉嫩小泬图片-国产精品99精品-粉嫩av一区二区在线播-色香蕉在线-动漫人妻h无码中文字幕-久青草影视-国产黄色视屏-免费在线看污视频-日韩av三级在线-2021国产精品视频网站-色婷婷www-亚洲天堂成人-国产性色αv视频免费-色xxxxxx-葵司免费一区二区三区四区五区

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

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

發布時間: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.zblcd.com.cn. 版權所有
長沙做網站多少錢   長沙做網站公司   長沙做網站價格   長沙做網站的 培訓班管理軟件
分享到: