在Android 4.2.2+叠加状态栏 [英] Overlay Status bar on android 4.2.2+

查看:199
本文介绍了在Android 4.2.2+叠加状态栏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要叠加的Andr​​oid状态栏。在我的情况下,它是在上面。我不希望覆盖或隐藏导航栏。

I want to overlay android status bar. In my case it is on top. I do not want to overlay or hide navigation bar.

注意:解决方案必须在Android 4.2.2+。我preFER答案无根的设备。

Note: Solution must work on android 4.2.2+. I prefer answers for non-rooted device.

我已经搜查了许多做题和答案,但没有适用于4.2.2。

I have searched many SO questions and answers, but none works on 4.2.2.

下面是我code,但它不消耗触摸事件。这就是为什么状态栏打开其面板。而且我不希望这样。

Below is my code, but it does not consume touch events. That's why status bar opens its panel. And I do not want this.

@Override 
public void onCreate() {
    super.onCreate();

    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

    int statusBarHeight = (int) Math.ceil(25 * getResources().getDisplayMetrics().density);

    overlay = new Button(this);
    overlay.setBackgroundColor(Color.GREEN);
    overlay.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.i("StatusBar", "touched");
            return false;
        }
    });

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.FILL_PARENT,
            statusBarHeight,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH|
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.TOP | Gravity.RIGHT;

    windowManager.addView(overlay, params);

}

@Override
public void onDestroy() {
    super.onDestroy();
    if (overlay != null) windowManager.removeView(overlay);
}

在主要活动我启动服务:

In main activity I start service:

startService(new Intent(this, StatusBarService.class));

和权限在AndroidManifest.xml中加入:

And permission is added in AndroidManifest.xml:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

而现在证明是可以做到的,它适用于4.2.2: 播放谷歌 - MobiLock

And now proof it can be done and it works on 4.2.2: Play Google - MobiLock

如何?

截图:

Screenshots:

推荐答案

尝试与放大器后,重复,这为我做:

After try&repeat, this did it for me:

int statusBarHeight = (int) Math.ceil(25 * getResources().getDisplayMetrics().density);

WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.FILL_PARENT,
            statusBarHeight,
            WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
            PixelFormat.TRANSLUCENT);

它可以在4.2.2和4.4.2

It works on 4.2.2 and 4.4.2

这篇关于在Android 4.2.2+叠加状态栏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆