您好,登錄后才能下訂單哦!
最近項(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è)參考,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。