Android適配底部虛擬按鍵的方法詳解
最近項(xiàng)目進(jìn)行適配的時候發(fā)現(xiàn)部分(如華為手機(jī))存在底部虛擬按鍵的手機(jī)會因?yàn)樘摂M按鍵的存在導(dǎo)致?lián)踝〔糠纸缑?,因?yàn)樾枰溜@示,故調(diào)用虛擬按鍵隱藏方法使之隱藏,然而發(fā)現(xiàn)出現(xiàn)如下問題:
手動操作隱藏虛擬按鍵后出現(xiàn)長白條區(qū)域
不自動隱藏
滑出狀態(tài)欄后虛擬按鍵也出來,狀態(tài)欄隱藏后虛擬卻不跟著隱藏
在沒有虛擬按鍵的設(shè)備上影響了SurfaceView全屏顯示圖傳(原本全屏顯示的圖傳在切出去再進(jìn)來時變成了小屏顯示)
通過google了很多方法并嘗試終于解決了這個問題,達(dá)到如下效果:
每次進(jìn)入界面時虛擬按鍵自動隱藏
手動滑出虛擬按鍵,當(dāng)不操作屏幕時定時自動隱藏
當(dāng)滑出狀態(tài)欄時虛擬按鍵會跟著出來,也要處理讓其和狀態(tài)欄在不操作時自動隱藏
具體代碼如下操作:
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()) {
//一定要判斷是否存在按鍵,否則在沒有按鍵的手機(jī)調(diào)用會影響別的功能。如之前沒有考慮到,導(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;
}
注:有些時候要手動去調(diào)用上述代碼中init()配置方法隱藏按鍵。如彈出dialog時虛擬按鍵會出來,此時要手動調(diào)用隱藏,還有彈出鍵盤等等。
記錄一下,以后遇到此類問題可供參考。
以上這篇Android適配底部虛擬按鍵的方法詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android開發(fā)中計算器的sin、cos及tan值計算問題分析
這篇文章主要介紹了Android開發(fā)中計算器的sin、cos及tan值計算問題,結(jié)合實(shí)例形式分析了Android三角函數(shù)運(yùn)算中的弧度與角度計算問題與相關(guān)解決方法,需要的朋友可以參考下2017-11-11
Android數(shù)據(jù)加密之SHA安全散列算法
這篇文章主要為大家詳細(xì)介紹了Android數(shù)據(jù)加密之SHA安全散列算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
Android登陸界面實(shí)現(xiàn)清除輸入框內(nèi)容和震動效果
這篇文章主要介紹了Android登陸界面實(shí)現(xiàn)清除輸入框內(nèi)容和震動效果,感興趣的小伙伴們可以參考一下2015-12-12
Android沉浸式狀態(tài)欄微技巧(帶你真正理解沉浸式模式)
因?yàn)锳ndroid官方從來沒有給出過沉浸式狀態(tài)欄這樣的命名,只有沉浸式模式(Immersive Mode)這種說法.下面通過本文給大家介紹Android沉浸式狀態(tài)欄微技巧,需要的朋友參考下2016-12-12
Android popupWindow彈出窗體實(shí)現(xiàn)方法分析
這篇文章主要介紹了Android popupWindow彈出窗體實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了Android彈出窗體的布局及popupwindow屬性設(shè)置、事件監(jiān)聽相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
C/C++在Java、Android和Objective-C三大平臺下實(shí)現(xiàn)混合編程
本文主要介紹C/C++在Java、Android和Objective-C三大平臺下實(shí)現(xiàn)混合編程,這里舉例說明實(shí)現(xiàn)不同平臺用C/C++實(shí)現(xiàn)編程的方法,有興趣的小伙伴可以參考下2016-08-08
Android啟動頁優(yōu)化之實(shí)現(xiàn)應(yīng)用秒開
現(xiàn)在很多應(yīng)用都會在進(jìn)入主界面之前,添加一個啟動頁,然后加入幾秒鐘的廣告,我覺得這個不能算是 “真正意義上的 “ 啟動頁,應(yīng)該叫廣告頁。2021-05-05
探究Android中ListView復(fù)用導(dǎo)致布局錯亂的解決方案
這篇文章主要介紹了探究Android中ListView復(fù)用導(dǎo)致布局錯亂的解決方案,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-10-10
Android?NDK開發(fā)(C語言--聯(lián)合體與枚舉)
這篇文章主要介紹了Android?NDK開發(fā)C語言聯(lián)合體與枚舉,共用體是一種特殊的數(shù)據(jù)類型,允許您在相同的內(nèi)存位置存儲不同的數(shù)據(jù)類型。您可以定義一個帶有多成員的共用體,但是任何時候只能有一個成員帶有值。下面詳細(xì)介紹該內(nèi)容,需要的朋友可以參考一下2021-12-12

