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

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

