在 android 4.4+ 或 kitkat 中隐藏状态栏

Posted

技术标签:

【中文标题】在 android 4.4+ 或 kitkat 中隐藏状态栏【英文标题】:Hide status bar in android 4.4+ or kitkat with Fullscreen 【发布时间】:2016-01-04 05:27:15 【问题描述】:

我正在使用以下代码来隐藏全屏状态栏:

    void HideEverything()
        if (Build.VERSION.SDK_INT < 16) 
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
         else 
            View decorView = getWindow().getDecorView();
            // Hide the status bar.
            int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
            decorView.setSystemUiVisibility(uiOptions);
            // Remember that you should never show the action bar if the
            // status bar is hidden, so hide that too if necessary.
            ActionBar actionBar = getActionBar();
            actionBar.hide();
        
    

它以全屏模式显示屏幕,但是当我触摸状态栏时,它会显示状态栏。 我尝试了其他选项在应用程序和清单中的活动级别中添加全屏和无标题栏主题,但结果仍然相同...... :(

我不想在任何步骤显示状态栏。 如何在android中实现这一点?

编辑:

Android 操作系统版本为 4.4.2 (以上代码适用于 4.3,但不适用于 4.4.2)

更新:

问题已解决... 答案分别写在下面...

【问题讨论】:

【参考方案1】:

由于 Android 版本为 4.4.2,因此无法解决此问题。

正如@Academy of Programmer 评论的那样;此解决方案不适用于 Android 6 及更高版本。

但是根据Sunny的建议,通过阻止状态栏扩展解决了问题。

解决办法是:

在您的主要活动中编写一个内联 customViewGroup 类。

public class customViewGroup extends ViewGroup 

        public customViewGroup(Context context) 
            super(context);
        

        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) 
        

        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) 
            Log.v("customViewGroup", "**********Intercepted");
            return true;
        
    

现在在mainActivityonCreate 方法中,在setContentView() 之前添加以下代码:

WindowManager manager = ((WindowManager) getApplicationContext()
                .getSystemService(Context.WINDOW_SERVICE));

        WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
        localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
        localLayoutParams.gravity = Gravity.TOP;
        localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|

                // this is to enable the notification to receive touch events
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |

                // Draws over status bar
                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;

        localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
        localLayoutParams.height = (int) (50 * getResources()
                .getDisplayMetrics().scaledDensity);
        localLayoutParams.format = PixelFormat.TRANSPARENT;

        customViewGroup view = new customViewGroup(this);

        manager.addView(view, localLayoutParams);

以上代码将禁用状态栏的扩展。 现在通过以下代码全屏,将其添加到上面的代码下方和setContentView之前:

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

现在在清单中添加权限:

<!-- prevent expanding status bar -->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

你就完成了.... :)

缺点:此代码disables expansion of status bar for the device 不仅仅用于活动或应用程序,因此如果您确实需要,请使用它。

感谢您提供的所有解决方案和建议... :)

【讨论】:

这是一个非常棒的解决方案,特别是当您需要全屏显示一些动画并且完成后只需删除创建的视图。感谢您提供此代码。 @Jyo the Whiff 这太棒了。你知道我怎样才能禁用软键(返回/主页?最近的应用程序)吗? 当 WindowManager.LayoutParams.TYPE_SYSTEM_ERROR 的功能消失时,此解决方案在即将发布的 Android 8 版本中将不再有效。见bleepingcomputer.com/news/security/…【参考方案2】:

我们无法阻止在 kitkat 或以上设备中以全屏模式显示状态,因此请尝试破解以阻止状态栏扩展。

为了一个想法,在状态栏上放置一个叠加层并使用所有输入事件。它会阻止状态栏展开。

【讨论】:

感谢您的建议...我已经解决了问题并添加了答案... :)【参考方案3】:

使用下面的代码,您可以使用全屏;

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

在 setcontentview 上面写下面的代码。

注意:不要为此活动指定任何主题。

希望这会有所帮助。

【讨论】:

【参考方案4】:

使用以下代码onCreate

 @Override
 protected void onCreate(Bundle savedInstanceState) 
 super.onCreate(savedInstanceState);
 requestWindowFeature(Window.FEATURE_NO_TITLE);   
 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
 

【讨论】:

以上是关于在 android 4.4+ 或 kitkat 中隐藏状态栏的主要内容,如果未能解决你的问题,请参考以下文章

Android 4.4 KitKat 随机崩溃

透明状态栏 - Android 4.4 (KitKat) 之前

无法在 Android 4.4 KitKat 上快速关闭 ChunkedInputStream

Android - 可扩展列表视图 SetIndicatorBounds 在 Kitkat android-4.4 中不起作用

利用 Android 4.4 KitKat 中的半透明状态栏

利用 Android 4.4 KitKat 中的半透明状态栏