动态隐藏导航栏

这篇博客介绍了Android中如何动态地添加和移除导航栏。通过对`StatusBarManager`类的`addNavigationBar()`和`removeNavigationBar()`方法的实现,开发者可以控制导航栏的显示与隐藏。相关代码修改涉及`Activity`、`StatusBarManager`、`StatusBar`等多个组件,展示了Android UI交互的实现细节。
摘要由CSDN通过智能技术生成

diff --git a/api/current.txt b/api/current.txt
index e909181..01925e7 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -6435,6 +6435,8 @@
   }
 
   public class StatusBarManager {
+    method public void addNavigationBar();
+    method public void removeNavigationBar();
   }
 
   public final class SyncNotedAppOp implements android.os.Parcelable {
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index b8734c2..6431a20 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -1613,8 +1613,6 @@
                         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                         | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                         | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
-                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
-                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                         | View.SYSTEM_UI_FLAG_IMMERSIVE
         );
 
@@ -3497,8 +3495,6 @@
                         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                         | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                         | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
-                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
-                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                         | View.SYSTEM_UI_FLAG_IMMERSIVE
         );
 
@@ -3530,8 +3526,6 @@
                         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                         | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                         | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
-                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
-                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                         | View.SYSTEM_UI_FLAG_IMMERSIVE
         );
 
@@ -3559,8 +3553,6 @@
                         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                         | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                         | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
-                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
-                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                         | View.SYSTEM_UI_FLAG_IMMERSIVE
         );
 
diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java
index 1329fa4..2d957d4 100644
--- a/core/java/android/app/StatusBarManager.java
+++ b/core/java/android/app/StatusBarManager.java
@@ -440,6 +440,28 @@
         }
     }
 
+    public void addNavigationBar() {
+        try {
+            final IStatusBarService svc = getService();
+            if (svc != null) {
+                svc.addNavigationBar();
+            }
+        } catch (RemoteException ex) {
+            throw ex.rethrowFromSystemServer();
+        }
+    }
+
+    public void removeNavigationBar() {
+        try {
+            final IStatusBarService svc = getService();
+            if (svc != null) {
+                svc.removeNavigationBar();
+            }
+        } catch (RemoteException ex) {
+            throw ex.rethrowFromSystemServer();
+        }
+    }
+
     /** @hide */
     public static String windowStateToString(int state) {
         if (state == WINDOW_STATE_HIDING) return "WINDOW_STATE_HIDING";
diff --git a/core/java/com/android/internal/app/WindowDecorActionBar.java b/core/java/com/android/internal/app/WindowDecorActionBar.java
index 0cd1202..6e9dc4c9 100644
--- a/core/java/com/android/internal/app/WindowDecorActionBar.java
+++ b/core/java/com/android/internal/app/WindowDecorActionBar.java
@@ -130,15 +130,17 @@
     final AnimatorListener mHideListener = new AnimatorListenerAdapter() {
         @Override
         public void onAnimationEnd(Animator animation) {
-            if (mContentAnimations && mContentView != null) {
+            if (mContentAnimations && mContentView != null && mContainerView != null) {
                 mContentView.setTranslationY(0);
                 mContainerView.setTranslationY(0);
             }
             if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) {
                 mSplitView.setVisibility(View.GONE);
             }
-            mContainerView.setVisibility(View.GONE);
-            mContainerView.setTransitioning(false);
+            if (mContainerView != null) {
+                mContainerView.setVisibility(View.GONE);
+                mContainerView.setTransitioning(false);
+            }
             mCurrentShowAnim = null;
             completeDeferredDestroyActionMode();
             if (mOverlayLayout != null) {
@@ -151,7 +153,9 @@
         @Override
         public void onAnimationEnd(Animator animation) {
             mCurrentShowAnim = null;
-            mContainerView.requestLayout();
+            if (mContainerView != null) {
+                mContainerView.requestLayout();
+            }
         }
     };
 
@@ -159,8 +163,10 @@
             new ValueAnimator.AnimatorUpdateListener() {
         @Override
         public void onAnimationUpdate(ValueAnimator animation) {
-            final ViewParent parent = mContainerView.getParent();
-            ((View) parent).invalidate();
+            if (mContainerView != null) {
+                final ViewParent parent = mContainerView.getParent();
+                ((View) parent).invalidate();
+            }
         }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值