Android適配底部虛擬按鍵的方法


---恢復內容開始---

最近項目進行適配的時候發現部分(如華為手機)存在底部虛擬按鍵的手機會因為虛擬按鍵的存在導致擋住部分界面,因為需要全屏顯示,故調用虛擬按鍵隱藏方法使之隱藏,然而發現出現如下問題:

  • 手動操作隱藏虛擬按鍵后出現長白條區域
  • 不自動隱藏
  • 滑出狀態欄后虛擬按鍵也出來,狀態欄隱藏后虛擬卻不跟着隱藏
  • 在沒有虛擬按鍵的設備上影響了SurfaceView全屏顯示圖傳(原本全屏顯示的圖傳在切出去再進來時變成了小屏顯示)

通過google了很多方法並嘗試終於解決了這個問題,達到如下效果:

  • 每次進入界面時虛擬按鍵自動隱藏
  • 手動滑出虛擬按鍵,當不操作屏幕時定時自動隱藏
  • 當滑出狀態欄時虛擬按鍵會跟着出來,也要處理讓其和狀態欄在不操作時自動隱藏

具體代碼如下操作:

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() { //調用配置 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; //判斷當前版本在4.0以上並且存在虛擬按鍵,否則不做操作 if (Build.VERSION.SDK_INT < 19 || !checkDeviceHasNavigationBar()) { //一定要判斷是否存在按鍵,否則在沒有按鍵的手機調用會影響別的功能。如之前沒有考慮到,導致圖傳全屏變成小屏顯示。 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; }

注:有些時候要手動去調用上述代碼中init()配置方法隱藏按鍵。如彈出dialog時虛擬按鍵會出來,此時要手動調用隱藏,還有彈出鍵盤等等。

記錄一下,以后遇到此類問題可供參考。

---恢復內容結束---

最近項目進行適配的時候發現部分(如華為手機)存在底部虛擬按鍵的手機會因為虛擬按鍵的存在導致擋住部分界面,因為需要全屏顯示,故調用虛擬按鍵隱藏方法使之隱藏,然而發現出現如下問題:

  • 手動操作隱藏虛擬按鍵后出現長白條區域
  • 不自動隱藏
  • 滑出狀態欄后虛擬按鍵也出來,狀態欄隱藏后虛擬卻不跟着隱藏
  • 在沒有虛擬按鍵的設備上影響了SurfaceView全屏顯示圖傳(原本全屏顯示的圖傳在切出去再進來時變成了小屏顯示)

通過google了很多方法並嘗試終於解決了這個問題,達到如下效果:

  • 每次進入界面時虛擬按鍵自動隱藏
  • 手動滑出虛擬按鍵,當不操作屏幕時定時自動隱藏
  • 當滑出狀態欄時虛擬按鍵會跟着出來,也要處理讓其和狀態欄在不操作時自動隱藏

具體代碼如下操作:

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() { //調用配置 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; //判斷當前版本在4.0以上並且存在虛擬按鍵,否則不做操作 if (Build.VERSION.SDK_INT < 19 || !checkDeviceHasNavigationBar()) { //一定要判斷是否存在按鍵,否則在沒有按鍵的手機調用會影響別的功能。如之前沒有考慮到,導致圖傳全屏變成小屏顯示。 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; }

注:有些時候要手動去調用上述代碼中init()配置方法隱藏按鍵。如彈出dialog時虛擬按鍵會出來,此時要手動調用隱藏,還有彈出鍵盤等等。

記錄一下,以后遇到此類問題可供參考。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM