【问题标题】:Android: Disable and enable to pulling the status bar programmatically for API 19Android:禁用和启用以编程方式为 API 19 拉状态栏
【发布时间】:2018-07-24 18:17:34
【问题描述】:

我已经完成了隐藏状态栏的操作,但不幸的是,一旦它已经隐藏,我没有找到将其显示回来的方法。我做了很多解决方法,但仍然没有成功,herehere

活动

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

customViewGroup 类

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) {
        return true;
    }
}

【问题讨论】:

    标签: android statusbar


    【解决方案1】:

    用于在 4.1 或更高版本上隐藏状态栏

    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();
    

    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    

    使状态栏可见

    View decorView = getWindow().getDecorView();
    // Hide the status bar.
    int uiOptions = View.SYSTEM_UI_FLAG_VISIBLE;
    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.show();
    

    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
    

    Refer Immersve View

    android Exit from full screen mode

    【讨论】:

    • 感谢您的回答,但我不想全屏,我想保留状态栏上的所有信息。只想禁用拉杆。抱歉我的解释有误。
    【解决方案2】:

    我认为永久禁用状态栏很困难。我也在研究同样的概念,做了很多研发,发现下面的代码很有用。如果用户尝试扩展状态栏,那么它会在一秒钟内将其拉回并且它也可以在 oreo 上工作。我尝试过不同的操作系统。

    public class BlockStatusBar { 
    Context context
    // To keep track of activity's window focus
        boolean currentFocus;
        // To keep track of activity's foreground/background status
        boolean isPaused;
    
        public Handler collapseNotificationHandler;
        Method collapseStatusBar = null;
    
        public BlockStatusBar(Context context, boolean isPaused) {
            this.context = context;
            this.isPaused = isPaused;
            collapseNow();
        }
    
        public void collapseNow() {
    
    
            // Initialize 'collapseNotificationHandler'
            if (collapseNotificationHandler == null) {
                collapseNotificationHandler = new Handler();
    
            }
    
            // If window focus has been lost && activity is not in a paused state
            // Its a valid check because showing of notification panel
            // steals the focus from current activity's window, but does not
            // 'pause' the activity
            if (!currentFocus && !isPaused) {
    
                Runnable myRunnable = new Runnable() {
                    public void run() {
                        // do something
                        try {
    
                            // Use reflection to trigger a method from 'StatusBarManager'
                            Object statusBarService = context.getSystemService("statusbar");
                            Class<?> statusBarManager = null;
    
                            try {
                                statusBarManager = Class.forName("android.app.StatusBarManager");
                            } catch (ClassNotFoundException e) {
                                Log.e(LOG_TAG, "" + e.getMessage());
                            }
    
                            try {
    
                                // Prior to API 17, the method to call is 'collapse()'
                                // API 17 onwards, the method to call is `collapsePanels()`
                                if (Build.VERSION.SDK_INT > 16) {
                                    collapseStatusBar = statusBarManager.getMethod("collapsePanels");
                                } else {
                                    collapseStatusBar = statusBarManager.getMethod("collapse");
                                }
                            } catch (NoSuchMethodException e) {
                                Log.e(LOG_TAG, "" + e.getMessage());
                            }
    
                            collapseStatusBar.setAccessible(true);
    
                            try {
                                collapseStatusBar.invoke(statusBarService);
                            } catch (IllegalArgumentException e) {
                                e.printStackTrace();
                            } catch (IllegalAccessException e) {
                                e.printStackTrace();
                            } catch (InvocationTargetException e) {
                                e.printStackTrace();
                            }
    
                            // Check if the window focus has been returned
                            // If it hasn'kioskthread been returned, post this Runnable again
                            // Currently, the delay is 100 ms. You can change this
                            // value to suit your needs.
                            if (!currentFocus && !isPaused) {
                                collapseNotificationHandler.postDelayed(this, 100L);
    
                            }
                            if (!currentFocus && isPaused) {
                                collapseNotificationHandler.removeCallbacksAndMessages(null);
                            }
                        } catch (Exception e) {
                            Log.e("MSG", "" + e.getMessage());
                        }
                    }
                };
                // Post a Runnable with some delay - currently set to 300 ms
                collapseNotificationHandler.postDelayed(myRunnable, 1L);
    
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多