Android適配底部虛擬按鍵的方法詳解
最近項(xiàng)目進(jìn)行適配的時(shí)候發(fā)現(xiàn)部分(如華為手機(jī))存在底部虛擬按鍵的手機(jī)會(huì)因?yàn)樘摂M按鍵的存在導(dǎo)致?lián)踝〔糠纸缑?,因?yàn)樾枰溜@示,故調(diào)用虛擬按鍵隱藏方法使之隱藏,然而發(fā)現(xiàn)出現(xiàn)如下問(wèn)題:
手動(dòng)操作隱藏虛擬按鍵后出現(xiàn)長(zhǎng)白條區(qū)域
不自動(dòng)隱藏
滑出狀態(tài)欄后虛擬按鍵也出來(lái),狀態(tài)欄隱藏后虛擬卻不跟著隱藏
在沒(méi)有虛擬按鍵的設(shè)備上影響了SurfaceView全屏顯示圖傳(原本全屏顯示的圖傳在切出去再進(jìn)來(lái)時(shí)變成了小屏顯示)
通過(guò)google了很多方法并嘗試終于解決了這個(gè)問(wèn)題,達(dá)到如下效果:
每次進(jìn)入界面時(shí)虛擬按鍵自動(dòng)隱藏
手動(dòng)滑出虛擬按鍵,當(dāng)不操作屏幕時(shí)定時(shí)自動(dòng)隱藏
當(dāng)滑出狀態(tài)欄時(shí)虛擬按鍵會(huì)跟著出來(lái),也要處理讓其和狀態(tài)欄在不操作時(shí)自動(dòng)隱藏
具體代碼如下操作:
public class TestActivity extends AppCompatActivity {
private View decorView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
//獲取頂層視圖
decorView = getWindow().getDecorView();
}
@Override
protected void onStart() {
//調(diào)用配置
init();
super.onStart();
}
private void init(){
int flag = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
//判斷當(dāng)前版本在4.0以上并且存在虛擬按鍵,否則不做操作
if (Build.VERSION.SDK_INT < 19 || !checkDeviceHasNavigationBar()) {
//一定要判斷是否存在按鍵,否則在沒(méi)有按鍵的手機(jī)調(diào)用會(huì)影響別的功能。如之前沒(méi)有考慮到,導(dǎo)致圖傳全屏變成小屏顯示。
return;
} else {
// 獲取屬性
decorView.setSystemUiVisibility(flag);
}
}
/**
* 判斷是否存在虛擬按鍵
* @return
*/
public boolean checkDeviceHasNavigationBar() {
boolean hasNavigationBar = false;
Resources rs = getResources();
int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
if (id > 0) {
hasNavigationBar = rs.getBoolean(id);
}
try {
Class<?> systemPropertiesClass = Class.forName("android.os.SystemProperties");
Method m = systemPropertiesClass.getMethod("get", String.class);
String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
if ("1".equals(navBarOverride)) {
hasNavigationBar = false;
} else if ("0".equals(navBarOverride)) {
hasNavigationBar = true;
}
} catch (Exception e) {
}
return hasNavigationBar;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
注:有些時(shí)候要手動(dòng)去調(diào)用上述代碼中init()配置方法隱藏按鍵。如彈出dialog時(shí)虛擬按鍵會(huì)出來(lái),此時(shí)要手動(dòng)調(diào)用隱藏,還有彈出鍵盤等等。
記錄一下,以后遇到此類問(wèn)題可供參考。
以上這篇Android適配底部虛擬按鍵的方法詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)狀態(tài)欄和虛擬按鍵背景顏色的變化實(shí)例代碼詳解
- Android隱藏手機(jī)底部虛擬按鍵的方法
- Android實(shí)現(xiàn)隱藏手機(jī)底部虛擬按鍵
- Android實(shí)現(xiàn)手機(jī)游戲隱藏虛擬按鍵
- Android 虛擬按鍵適配動(dòng)態(tài)調(diào)整布局的方法
- android底層去掉虛擬按鍵的實(shí)例講解
- Android dialog 去除虛擬按鍵的解決方法
- 解決Android 虛擬按鍵遮住了頁(yè)面內(nèi)容的問(wèn)題
- Android 虛擬按鍵與沉浸式的適配方法
- Android如何解決虛擬按鍵欄遮擋問(wèn)題
相關(guān)文章
android計(jì)算pad或手機(jī)的分辨率/像素/密度/屏幕尺寸/DPI值的方法
本文將介紹手機(jī)布局/界面設(shè)計(jì)/分辨率/密度相關(guān),接下來(lái)介紹android計(jì)算pad或手機(jī)的分辨率像素等等的方法,感興趣的朋友可以了解下,希望本文可以幫助你2013-01-01
Android 出現(xiàn)問(wèn)題Installation error: INSTALL_FAILED_CONFLICTING_P
這篇文章主要介紹了Android 出現(xiàn)問(wèn)題Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER解決辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12
Android自定義有限制區(qū)域圖例角度自識(shí)別涂鴉工具類中篇
這篇文章主要為大家介紹了Android自定義有限制區(qū)域圖例角度自識(shí)別涂鴉工具類詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Android 微信6.1 tab欄圖標(biāo)和字體顏色漸變的實(shí)現(xiàn)
本文主要對(duì)微信6.1 tab 欄顏色漸變效果的實(shí)現(xiàn)全過(guò)程進(jìn)行分析介紹,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2016-12-12
Android Zxing生成二維碼經(jīng)典案例分享
這篇文章主要為大家分享了Android Zxing生成二維碼經(jīng)典案例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
探究Android客戶端網(wǎng)絡(luò)預(yù)連接優(yōu)化機(jī)制
一般情況下,我們都是用一些封裝好的網(wǎng)絡(luò)框架去請(qǐng)求網(wǎng)絡(luò),對(duì)底層實(shí)現(xiàn)不甚關(guān)注,而大部分情況下也不需要特別關(guān)注處理。了解底層的一些實(shí)現(xiàn),有益于我們對(duì)網(wǎng)絡(luò)加載進(jìn)行優(yōu)化。本文就是關(guān)于根據(jù)http的連接復(fù)用機(jī)制來(lái)優(yōu)化網(wǎng)絡(luò)加載速度的原理與細(xì)節(jié)2021-06-06
WebView的介紹與簡(jiǎn)單實(shí)現(xiàn)Android和H5互調(diào)的方法
這篇文章主要給大家介紹了關(guān)于WebView與簡(jiǎn)單實(shí)現(xiàn)Android和H5互調(diào)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
Flutter實(shí)現(xiàn)牛頓擺動(dòng)畫效果的示例代碼
牛頓擺大家應(yīng)該都不陌生,也叫碰碰球、永動(dòng)球(理論情況下),那么今天我們用Flutter實(shí)現(xiàn)這么一個(gè)理論中的永動(dòng)球,可以作為加載Loading使用,需要的可以參考一下2022-04-04
Android自定義view實(shí)現(xiàn)太極效果實(shí)例代碼
這篇文章主要介紹了Android自定義view實(shí)現(xiàn)太極效果實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05

