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

首頁下部分是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) {//導(dǎo)航鍵隱藏了
Log.e("導(dǎo)航鍵隱藏了", "-----");
gridView_Home.getViewTreeObserver().addOnGlobalLayoutListener(HomeActivity.this);
} else {//導(dǎo)航鍵顯示了
Log.e("導(dǎo)航鍵顯示了", "-----");
gridView_Home.getViewTreeObserver().addOnGlobalLayoutListener(HomeActivity.this);
}
}
};
給View添加全局的布局監(jiān)聽器
可以看到當(dāng)虛擬按鍵切換的時(shí)候我會調(diào)用view的getViewTreeObserver().addOnGlobalLayoutListener給view設(shè)置全局的布局監(jiān)聽器,用于獲取當(dāng)前view可顯示的實(shí)際高度,然后根據(jù)高度動態(tài)設(shè)置子item的高度
布局監(jiān)聽器的回調(diào)
在回調(diào)中測量RecylerView可顯示的實(shí)際高度
@Override
public void onGlobalLayout() {
refreshGridViewHeight();
}
注意這個回調(diào)是會調(diào)用多次的,獲取完高度后要移除這個監(jiān)聽,否則會造成界面卡頓
private void refreshGridViewHeight() {
gridView_Home.post(new Runnable() {
@Override
public void run() {
//獲取到寬度和高度后,可用于計(jì)算
int height = gridView_Home.getHeight();
//根據(jù)屏幕高度計(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或界面銷毀的地方注銷剛才設(shè)置的系統(tǒng)廣播接收者
getContentResolver().unregisterContentObserver(mNavigationStatusObserver);
以上這篇Android 虛擬按鍵適配動態(tài)調(diào)整布局的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android手冊之Toolbar搜索聯(lián)動及監(jiān)聽小技巧
這篇文章主要為大家介紹了Android手冊之Toolbar搜索聯(lián)動及監(jiān)聽小技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Android實(shí)現(xiàn)ListView異步加載圖片的方法
這篇文章主要介紹了Android實(shí)現(xiàn)ListView異步加載圖片的方法,以實(shí)例形式較為詳細(xì)的分析了Android中ListView異步加載圖片的原理與相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android開發(fā)重寫Animation實(shí)現(xiàn)下拉圖片后彈射回去效果示例
這篇文章主要介紹了Android開發(fā)重寫Animation實(shí)現(xiàn)下拉圖片后彈射回去效果,結(jié)合實(shí)例形式分析了Android自定義類繼承Animation實(shí)現(xiàn)圖片彈射效果的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Android實(shí)現(xiàn)測試環(huán)境噪音分貝
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)測試環(huán)境噪音分貝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Android利用animation-list實(shí)現(xiàn)幀動畫
這篇文章主要為大家詳細(xì)介紹了Android利用animation-list實(shí)現(xiàn)幀動畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android Studio中引入Lambda表達(dá)式的方法
這篇文章主要給大家介紹了在Android Studio中引入Lambda表達(dá)式的方法,文中通過圖文介紹的非常詳細(xì),對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03
Android編程實(shí)現(xiàn)播放音頻的方法示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)播放音頻的方法,結(jié)合實(shí)例形式分析了Android使用MediaPlayer類播放音頻的相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
Android實(shí)現(xiàn)簡單的popupwindow提示框
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡單的popupwindow提示框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
Android中判斷網(wǎng)絡(luò)是否連接實(shí)例詳解
這篇文章主要介紹了Android中判斷網(wǎng)絡(luò)是否連接實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01

