android - 在 android 4.2.2+ 上覆盖状态栏

标签 android android-ui statusbar android-4.2-jelly-bean android-launcher

我想覆盖 android 状态栏。就我而言,它在最上面。我不想覆盖或隐藏导航栏。

注意:解决方案必须适用于 android 4.2.2+。我更喜欢非根设备的答案。

我搜索了很多 SO 问题和答案,但没有一个适用于 4.2.2。

下面是我的代码,但它不消耗触摸事件。这就是状态栏打开其面板的原因。我不想要这个。

@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);
}

在主要 Activity 中我开始服务:

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

并在AndroidManifest.xml中添加权限:

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

现在证明它可以完成并且可以在 4.2.2 上运行: Play Google - MobiLock

怎么做?

屏幕截图: enter image description here enter image description here

最佳答案

在 try&repeat 之后,这是为我做的:

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

关于android - 在 android 4.2.2+ 上覆盖状态栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25810556/

相关文章:

java - Android 中管理 View 重用的代码在哪里?

android - 如何在 GridView/ListView 的每个元素上更新 ProgressBar 的状态?

android - 为对话框创建阴影

iOS 7 红色状态栏

android - setfitsystemwindows not working windowtranslucentstatus coordinatorlayout

android - 通知图标,在某些设备上为全白色,在其他设备上为多色。为什么?

Android sqlite 从 ListView 中删除

java - Android ListPreference不保存选择

android - 安卓 : Fill ListView with database

java - 我想从 firebase 数据库中的单个 Textview 中获取完整数据