Android適配底部虛擬按鍵的方法
阿新 • • 發佈:2019-01-28
最近專案進行適配的時候發現部分(如華為手機)存在底部虛擬按鍵的手機會因為虛擬按鍵的存在導致擋住部分介面,因為需要全屏顯示,故呼叫虛擬按鍵隱藏方法使之隱藏,然而發現出現如下問題:
- 手動操作隱藏虛擬按鍵後出現長白條區域
- 不自動隱藏
- 滑出狀態列後虛擬按鍵也出來,狀態列隱藏後虛擬卻不跟著隱藏
- 在沒有虛擬按鍵的裝置上影響了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時虛擬按鍵會出來,此時要手動呼叫隱藏,還有彈出鍵盤等等。
記錄一下,以後遇到此類問題可供參考。