自上而下阻止状态栏滑动

时间:2014-10-13 07:30:04

标签: android fullscreen swipe statusbar

我有一个全屏应用程序,涵盖整个屏幕,包括顶部状态栏。 由于向上/向下滑动已启用向用户显示某些选项,因此从上到下会出现滑动,状态栏正在显示(如果您想要查看通知并自上而下滑动) 。 有没有办法避免这种情况?

2 个答案:

答案 0 :(得分:1)

对WindowManager.LayoutParams使用类型 TYPE_SYSTEM_ERROR ,以创建隐藏不可能的全屏视图。 显示状态栏和导航的滑动将被阻止。

https://github.com/dayvson/hls-endless

如果需要,你应该在显示器开机(解锁屏幕)后显示它。添加代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mMainLayout = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout.activity_fullscreen, null);

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    WindowManager.LayoutParams handleParams = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.MATCH_PARENT,
        WindowManager.LayoutParams.MATCH_PARENT,
        WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
        PixelFormat.TRANSLUCENT);
    handleParams.gravity = Gravity.TOP;

    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    windowManager.addView(mMainLayout, handleParams);
}

答案 1 :(得分:0)

有几种选择。行前

super.onCreate(savedInstanceState)

添加以下内容:

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

这应该完全摆脱状态栏。基本上没有标题的功能会删除顶部工具栏,为了确保全屏尺寸,我们正在为高度和宽度设置全屏标记。

就防止擦拭而言,有一个可以使用的技巧。一旦您处于真正的全屏状态,基本上会在顶部放置一个不可见的视图,以防止任何滑动。例如,

View disableStatusBarView = new View(context);

WindowManager.LayoutParams handleParams = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.FILL_PARENT,
    <height of the status bar>,
    // This allows the view to be displayed over the status bar
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
    // this is to keep button presses going to the background window
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
    // this is to enable the notification to recieve touch events
    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
    // Draws over status bar
    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
    PixelFormat.TRANSLUCENT);

handleParams.gravity = Gravity.TOP;
context.getWindow().addView(disableStatusBarView, handleParams);

这将在状态栏上创建一个不可见的视图,该视图将接收触摸事件并阻止事件到达状态栏,从而阻止其展开。

或者,这项工作效果最好,就是覆盖windowFocusChanged方法。基本上你不会阻止状态栏扩展,但你正在阻止使用。因为一旦扩展,它就会关闭。我说这是最好的,因为使用隐形视图方法,您可能需要考虑屏幕的尺寸,以使其对所有设备都有效。所以还有更多工作要做。

首先,在清单

中声明权限
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>

然后覆盖onWindowFocusChanged方法,

public void onWindowFocusChanged(boolean hasFocus)
{
        try
        {
           if(!hasFocus)
           {
                Object service  = getSystemService("statusbar");
                Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
                Method collapse = statusbarManager.getMethod("collapse");
                collapse .setAccessible(true);
                collapse .invoke(service);
           }
        }
        catch(Exception ex)
        {
        }
}