IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android R设置中增加菜单控制导航栏显示与隐藏 -> 正文阅读

[移动开发]android R设置中增加菜单控制导航栏显示与隐藏

最近做客户项目,客户要求在设置中新增菜单来控制导航栏的显示与隐藏,由于之前在9.0上也有做过,所以就想当然认为也可以直接移植就OK,然后把补丁跟R的代码一对比,差别太大,完全没办法用。那好吧,老老实实读代码,看看该怎么加合适。
设置里面加菜单倒是简单,主要是如何隐藏跟显示导航栏这个不好搞。所以就花了点时间好好的梳理了一下导航栏加载跟显示的流程,梳理通顺后该改哪里该怎么改就水到渠成了。结果最重要,直接上代码吧。

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java

@@ -171,6 +171,11 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
 
     protected NavigationBarView mNavigationBarView = null;
 
+    //Added by qxbin@20210809
+    private static View mNavigationBarWindowView = null;
+    private ContentObserver mNavigationbarShowObserver;
+    //ending
+
     private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
 
     private int mNavigationIconHints = 0;
@@ -454,6 +459,17 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
                 Settings.System.getUriFor(Settings.System.SCREENSHOT_BUTTON_SHOW), true,
                 mScreenshotShowObserver, UserHandle.USER_ALL);
 
+        //Added by qxbin@20210809
+        mNavigationbarShowObserver = new ContentObserver( getContext().getMainThreadHandler()) {
+            @Override
+            public void onChange(boolean selfChange) {
+                mNavigationBarWindowView.setVisibility(Settings.System.getInt(mContentResolver, "show_navigartion_bar", 0) == 1 ? View.VISIBLE : View.GONE);
+            }
+        };
+        
+        mContentResolver.registerContentObserver(Settings.System.getUriFor("show_navigartion_bar"), true, mNavigationbarShowObserver, UserHandle.USER_ALL);
+        //ending
+
         if (savedInstanceState != null) {
@@ -488,6 +504,12 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
         if(null != mScreenshotShowObserver){
             mContentResolver.unregisterContentObserver(mScreenshotShowObserver);
         }
+
+        //Added by qxbin@20210809
+        if(null != mNavigationbarShowObserver){
+            mContentResolver.unregisterContentObserver(mNavigationbarShowObserver);
+        }
+        //ending
     }
 
     @Override
@@ -1500,7 +1522,8 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
         }
     };
 
-    public static View create(Context context, FragmentListener listener) {
+    //Modified by qxbin@20210809
+    /*public static View create(Context context, FragmentListener listener) {
         WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
                 LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
                 WindowManager.LayoutParams.TYPE_NAVIGATION_BAR,
 @@ -1543,7 +1566,59 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
         });
         context.getSystemService(WindowManager.class).addView(navigationBarView, lp);
         return navigationBarView;
+    }*/
+
+    public static View create(Context context, FragmentListener listener) {
+        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
+                WindowManager.LayoutParams.TYPE_NAVIGATION_BAR,
+                WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
+                        | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
+                        | WindowManager.LayoutParams.FLAG_SLIPPERY,
+                PixelFormat.TRANSLUCENT);
+        lp.token = new Binder();
+        lp.setTitle("NavigationBar" + context.getDisplayId());
+        lp.accessibilityTitle = context.getString(R.string.nav_bar);
+        lp.windowAnimations = 0;
+        lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC;
+
+        mNavigationBarWindowView = LayoutInflater.from(context).inflate(
+                R.layout.navigation_bar_window, null);
+
+        if(Settings.System.getInt(context.getContentResolver(), "show_navigartion_bar", 0) == 1){
+            mNavigationBarWindowView.setVisibility(View.VISIBLE);
+        }else{
+            mNavigationBarWindowView.setVisibility(View.GONE);
+        }
+
+        if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + mNavigationBarWindowView);
+        if (mNavigationBarWindowView == null) return null;
+
+        final NavigationBarFragment fragment = FragmentHostManager.get(mNavigationBarWindowView)
+                .create(NavigationBarFragment.class);
+        mNavigationBarWindowView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
+            @Override
+            public void onViewAttachedToWindow(View v) {
+                final FragmentHostManager fragmentHost = FragmentHostManager.get(v);
+                fragmentHost.getFragmentManager().beginTransaction()
+                        .replace(R.id.navigation_bar_frame, fragment, TAG)
+                        .commit();
+                fragmentHost.addTagListener(TAG, listener);
+            }
+
+            @Override
+            public void onViewDetachedFromWindow(View v) {
+                FragmentHostManager.removeAndDestroy(v);
+                mNavigationBarWindowView.removeOnAttachStateChangeListener(this);
+            }
+        });
+        context.getSystemService(WindowManager.class).addView(mNavigationBarWindowView, lp);
+        return mNavigationBarWindowView;
     }
+    //ending
 
     @VisibleForTesting
     int getNavigationIconHints() {

关于设置里面的修改这里就不就啰嗦了。希望对大家有所帮助!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-15 15:43:16  更:2021-08-15 15:43:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:49:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码