1. 程式人生 > >android監聽虛擬按鍵的顯示與隱藏

android監聽虛擬按鍵的顯示與隱藏

虛擬按鍵在華為手機中大量存在,而虛擬按鍵的存在無疑增加了螢幕適配的難度,往往許多時候我們的介面需要根據虛擬按鍵的顯示與否(虛擬按鍵的顯示隱藏是使用者可以動態調整的)來調整介面的ui顯示,但android系統本身(似乎)並沒有提供此類介面(PS:反正我沒找到類似介面),經過研究得到一個可用的方式。
android手機介面分為SystemUi【包括status bar(狀態列)以及navigation bar(導航欄/虛擬按鍵)】和content,在android系統中content的id是 android.R.id.content,所以思路就是通過監聽content佈局的改變來間接監聽虛擬按鍵的顯示與隱藏;
其他的activity繼承該activity即可。

具體程式碼如下:

public class BaseActivityForAuto extends Activity implements ViewTreeObserver.OnGlobalLayoutListener {
    FrameLayout content;
    private static final String TAG = "BaseActivityForAuto";
    private boolean mLayoutComplete = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        content = (FrameLayout) findViewById(android.R.id.content);
        content.post(new Runnable() {
            @Override
            public void run() {
                mLayoutComplete = true;
                Log.e(TAG, "content 佈局完成");
            }
        });
        content.getViewTreeObserver().addOnGlobalLayoutListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e(TAG, "super.onPause();");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG, "super.onResume();");
    }

    @Override
    public void onGlobalLayout() {
        Log.e(TAG, "onGlobalLayout");
        if (!mLayoutComplete) return;
        onNavigationBarStatusChanged();
    }

    protected void onNavigationBarStatusChanged() { // 子類重寫該方法,實現自己的邏輯即可。 
    
    }
    
    @Override protected void onDestroy () {
            super.onDestroy();
            content.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    }
}

參考1:https://blog.csdn.net/guolin_blog/article/details/51763825

參考2:https://blog.csdn.net/dliyuedong/article/details/49360807