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

你可能感兴趣的:(Android)