Android 虛擬按鍵適配動態(tài)調整布局的方法
最近項目中遇到了華為虛擬按鍵適配的問題,主頁是個RecylerView(如下圖),如果不做適配,在界面初始化完畢后,虛擬按鍵會遮擋頁面或者空出一些留白部分,針對這個問題上網(wǎng)找了些資料,總結了以下方法

首頁下部分是RecylerView
首頁下半部分是個RecylerView(針對適配)
監(jiān)聽虛擬鍵的切換
注冊系統(tǒng)廣播
getContentResolver().registerContentObserver(Settings.System.getUriFor("navigationbar_is_min"), true, mNavigationStatusObserver);
private ContentObserver mNavigationStatusObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
int navigationBarIsMin = Settings.System.getInt(getContentResolver(),
"navigationbar_is_min", 0);
if (navigationBarIsMin == 1) {//導航鍵隱藏了
Log.e("導航鍵隱藏了", "-----");
gridView_Home.getViewTreeObserver().addOnGlobalLayoutListener(HomeActivity.this);
} else {//導航鍵顯示了
Log.e("導航鍵顯示了", "-----");
gridView_Home.getViewTreeObserver().addOnGlobalLayoutListener(HomeActivity.this);
}
}
};
給View添加全局的布局監(jiān)聽器
可以看到當虛擬按鍵切換的時候我會調用view的getViewTreeObserver().addOnGlobalLayoutListener給view設置全局的布局監(jiān)聽器,用于獲取當前view可顯示的實際高度,然后根據(jù)高度動態(tài)設置子item的高度
布局監(jiān)聽器的回調
在回調中測量RecylerView可顯示的實際高度
@Override
public void onGlobalLayout() {
refreshGridViewHeight();
}
注意這個回調是會調用多次的,獲取完高度后要移除這個監(jiān)聽,否則會造成界面卡頓
private void refreshGridViewHeight() {
gridView_Home.post(new Runnable() {
@Override
public void run() {
//獲取到寬度和高度后,可用于計算
int height = gridView_Home.getHeight();
//根據(jù)屏幕高度計算單個菜單的高度,保證屏幕能被填滿
final int itemHeight = height / 3 - 3;
runOnUiThread(new Runnable() {
@Override
public void run() {
homeMenuAdapter.setIemtHeight(itemHeight);
gridView_Home.setAdapter(homeMenuAdapter);
mPresenter.refushGridData();
if (Build.VERSION.SDK_INT < 16) {
gridView_Home.getViewTreeObserver().removeGlobalOnLayoutListener(HomeActivity.this);
} else {
gridView_Home.getViewTreeObserver().removeOnGlobalLayoutListener(HomeActivity.this);
}
}
});
}
});
這個移除布局監(jiān)聽的方法還要兼容低版本,所以要分情況,具體看代碼
最后記得在Activity的onDestroy或界面銷毀的地方注銷剛才設置的系統(tǒng)廣播接收者
getContentResolver().unregisterContentObserver(mNavigationStatusObserver);
以上這篇Android 虛擬按鍵適配動態(tài)調整布局的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Android 沉浸式改變小米魅族狀態(tài)欄顏色的實例代碼
這篇文章主要介紹了Android 沉浸式改變小米魅族狀態(tài)欄顏色的實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-02-02
Android開發(fā)實現(xiàn)拍照功能的方法實例解析
這篇文章主要介紹了Android開發(fā)實現(xiàn)拍照功能的方法,結合實例形式較為詳細的分析了Android拍照功能的具體實現(xiàn)步驟與相關操作技巧,需要的朋友可以參考下2017-10-10
Android Viewpager實現(xiàn)輪播廣告圖
這篇文章主要為大家詳細介紹了Android Viewpager實現(xiàn)輪播廣告圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
InputFilter實現(xiàn)EditText文本輸入過濾器實例代碼解析
EditText是Android的文本輸入框控件。這篇文章給大家介紹 InputFilter實現(xiàn)EditText文本輸入過濾器實例代碼解析,需要的朋友一起看看吧2016-11-11
Android6.0編程實現(xiàn)雙向通話自動錄音功能的方法詳解
這篇文章主要介紹了Android6.0編程實現(xiàn)雙向通話自動錄音功能的方法,結合實例形式分析了Android錄音功能的原理、實現(xiàn)技巧與相關注意事項,需要的朋友可以參考下2017-07-07
Android程序開發(fā)通過HttpURLConnection上傳文件到服務器
這篇文章主要介紹了Android程序開發(fā)通過HttpURLConnection上傳文件到服務器的相關資料,需要的朋友可以參考下2016-01-01
Android開發(fā)中ProgressDialog簡單用法示例
這篇文章主要介紹了Android開發(fā)中ProgressDialog簡單用法,結合實例形式分析了Android使用ProgressDialog的進度條顯示與關閉、更新等事件響應相關操作技巧,需要的朋友可以參考下2017-10-10
Flutter實現(xiàn)PopupMenu彈出式菜單按鈕詳解
這篇文章主要介紹了Flutter實現(xiàn)PopupMenu彈出式菜單按鈕,PopupMenuButton是一個用于創(chuàng)建彈出菜單的小部件,當用戶點擊觸發(fā)按鈕時,PopupMenuButton會在屏幕上方或下方彈出一個菜單,感興趣想要詳細了解可以參考下文2023-05-05
將Eclipse工程轉Android Studio工程的步驟與注意事項
這篇文章主要給大家介紹了將Eclipse工程轉Android Studio工程的方法步驟,并給大家分享了其中的一些注意事項,文中將實現(xiàn)的步驟一步步介紹的非常詳細,需要的朋友們可以參考借鑒,下面隨著小編來一起學習學習吧。2017-11-11

