动态显示和隐藏状态栏

小米Launcher有一个细节上的功能效果:在长按桌面应用图标时,会隐藏状态栏,然后在状态栏原有的布局上显示卸载或删除的操作栏。放手后,操作栏隐藏,状态栏显示出来。也就是说,这个过程是涉及到对状态栏的动态操作的

    View类提供了setSystemUiVisibility和getSystemUiVisibility方法,这两个方法实现对状态栏的动态显示或隐藏的操作,以及获取状态栏当前可见性。

   setSystemUiVisibility(int visibility)方法可传入的实参为:

    1. View.SYSTEM_UI_FLAG_VISIBLE:显示状态栏,Activity不全屏显示(恢复到有状态的正常情况)。

    2. View.INVISIBLE:隐藏状态栏,同时Activity会伸展全屏显示。

    3. View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏显示,且状态栏被隐藏覆盖掉。

    4. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。

    5. View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

    6. View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

    7. View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏虚拟按键(导航栏)。有些手机会用虚拟按键来代替物理按键。

    8. View.SYSTEM_UI_FLAG_LOW_PROFILE:状态栏显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。

Android 悬浮窗菜单,可在launcher或app中使用。示例代码:@Override public void onCreate() {     super.onCreate();     mFloatMenu = new FloatMenu.Builder(this)             .floatLoader(R.drawable.yw_anim_background)             .floatLogo(R.drawable.yw_image_float_logo)             .addMenuItem(android.R.color.transparent, R.drawable.yw_menu_account, Const.MENU_ITEMS[0], android.R.color.black, this)             .addMenuItem(android.R.color.transparent, R.drawable.yw_menu_favour, Const.MENU_ITEMS[1], android.R.color.black, this)             .addMenuItem(android.R.color.transparent, R.drawable.yw_menu_fb, Const.MENU_ITEMS[2], android.R.color.black, this)             .addMenuItem(android.R.color.transparent, R.drawable.yw_menu_msg, Const.MENU_ITEMS[3], android.R.color.black, this)             .addMenuItem(android.R.color.transparent, R.drawable.yw_menu_close, Const.MENU_ITEMS[4], android.R.color.black, this)             .menuBackground(R.drawable.yw_menu_bg)             .onMenuActionListner(this)             .build();     mFloatMenu.show(); } public void showFloat() {     if (mFloatMenu != null)         mFloatMenu.show(); } public void hideFloat() {     if (mFloatMenu != null) {         mFloatMenu.hide();     } } public void destroyFloat() {     hideFloat();     if (mFloatMenu != null) {         mFloatMenu.destroy();     }     mFloatMenu = null; }  private void showRed() {     if (!hasNewMsg) {         mFloatMenu.changeLogo(R.drawable.yw_image_float_logo, R.drawable.yw_menu_msg, 3);     } else {         mFloatMenu.changeLogo(R.drawable.yw_image_float_logo_red, R.drawable.yw_menu_msg_red, 3);     } }
在Android 11(API级别30及以上)中,态调整状态栏的行为变得更加复杂,因为Google引入了更严格的隐私和权限管理。如果你想在运行态地改变应用是否显示或隐藏状态栏,你需要遵守以下步骤: 1. **检查权限**: 首先,确保你的应用已经有了`SYSTEM_UI_FLAG_ADJUST_WITH_ACTIVITY`权限。这可以通过在AndroidManifest.xml文件中的`<activity>`标签添加`android:configChanges="orientation|screenSize"`属性以及相应的`<uses-permission>`来获取: ```xml <activity ... android:configChanges="orientation|screenSize" android:requestLegacyExternalStorage="true"> <meta-data android:name="android.support.UI_OPTIONS" android:value="splitActionBarWhenNarrow"/> ... </activity> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> ``` 2. **使用Policy API**: 使用`WindowManager.LayoutParams.FLAG_FULLSCREEN`标志来控制状态栏的显示。但是请注意,从API 30开始,直接设置全屏可能被拒绝。你应该使用`SystemUiVisibility`枚举来间接更改: ```java import androidx.annotation.RequiresApi; import android.view.View; import android.view.WindowManager; @RequiresApi(api = Build.VERSION_CODES.R) public void toggleStatusBar(View view) { int visibility = view.getSystemUiVisibility(); if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { // 显示状态栏 view.setSystemUiVisibility(visibility | View.SYSTEM_UI_FLAG_FULLSCREEN); } else { // 隐藏状态栏 view.setSystemUiVisibility(visibility & ~View.SYSTEM_UI_FLAG_FULLSCREEN); } } ``` 3. **响应系统通知**: Android 11要求你在`onCreate()`, `onConfigurationChanged()`等生命周期回调中处理`ACTION_CLOSE_SYSTEM_DIALOGS`广播,以适应系统的全屏模式变化。 4. **适配Android 11的Scoped Storage**: 如果你的应用依赖于`ACTION_EXTERNAL_APPLICATIONS_AVAILABLE`广播来检测外部存储的变化,那么在Android 11中可能需要进行额外的权限管理和适配。 记得,在实际开发过程中,要根据设备的实际行为进行测试,因为某些厂商可能会提供自己的定制版本,对这些API的响应可能有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值