在Android 4.4+或KitKat中使用全屏模式隐藏状态栏

3
我正在使用以下代码来隐藏状态栏以实现全屏目的:
    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)
更新: 问题已解决... 答案写在下面分开...
4个回答

7

由于Android版本为4.4.2,因此没有解决方案可解决该问题。

@程序员学院的评论; 该解决方案不适用于Android 6及以上版本。

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

解决方案如下:

在主活动中编写一个内联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"/>

完成啦... :)

缺点 : 这段代码禁用了设备的状态栏扩展,不仅仅是针对一个活动或应用程序,因此只有在确实需要时才使用。

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


1
这是一个非常棒的解决方案,特别是当您需要在全屏显示一些动画时,完成后只需删除创建的视图即可。感谢您提供此代码。 - DoubleK
@Jyo the Whiff 这太棒了。你知道我怎样能够禁用软键(返回/主页?最近应用)吗? - Dave
这个解决方案在即将发布的Android 8版本中将不再起作用,因为WindowManager.LayoutParams.TYPE_SYSTEM_ERROR的功能已经消失。请参见https://www.bleepingcomputer.com/news/security/android-o-will-contain-special-feature-to-fight-off-ransomware/。 - Redwolf

4

我们无法防止状态栏在KitKat或以上版本的设备上出现全屏模式,因此尝试使用技巧来阻止状态栏扩展。

一个想法是,在状态栏上放置一个覆盖层并消耗所有输入事件。这将防止状态栏扩展。


1
谢谢您的建议...我已经解决了这个问题并添加了答案... :) - Jyo the Whiff

2
使用以下代码可以使用全屏模式;
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

在setcontentview之前编写以下代码。

注意:不要为此活动提供任何主题。

希望这可以帮助你。

0
请在 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);
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接