android 9 Systemui 动态隐藏导航栏

简介: android 9 Systemui 动态隐藏导航栏

1.首先在Setting里增加菜单,作为隐藏导航栏的开关

定义字符串 packages/apps/Settings/res/values/strings.xml

<string name="ctrl_navigationbar">Hide NavigationBar</string>

添加菜单项 packages/apps/Settings/res/xml/display_settings.xml

  <SwitchPreference
    android:key="ctrl_navigationbar"
    android:title="@string/ctrl_navigationbar"/>

增加对应的控制器列表  packages/apps/Settings/src/com/android/settings/DisplaySettings.java

controllers.add(new NavigationBarPreferenceController(context));

增加控制器

packages/apps/Settings/src/com/android/settings/display/NavigationBarPreferenceController.java

 

package com.android.settings.display;
 
import android.content.Context;
import android.provider.Settings;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
 
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import android.content.Intent;
import android.util.Log;
import android.os.SystemProperties;
 
public class NavigationBarPreferenceController extends AbstractPreferenceController
        implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener {
 
    private static final String TAG = "NavigationBarCtrl";
    private static final boolean DEBUG = true;
    private static final String KEY_NAVIGATION_BAR = "ctrl_navigationbar";
    public static final String ACTION_HIDE_NAVIGATION_BAR = "com.systemui.navigationbar.hide";
    public static final String ACTION_SHOW_NAVIGATION_BAR = "com.systemui.navigationbar.show";
 
    public NavigationBarPreferenceController(Context context) {
        super(context);
    }
 
    @Override
    public String getPreferenceKey() {
        return KEY_NAVIGATION_BAR;
    }
 
    @Override
    public boolean isAvailable() {
        return true;
    }
 
    @Override
    public void displayPreference(PreferenceScreen screen) {
        if (!isAvailable()) {
            setVisible(screen, KEY_NAVIGATION_BAR, false /* visible */);
            return;
        }
 
        final SwitchPreference mNavigationBarPreference = (SwitchPreference)screen.findPreference(KEY_NAVIGATION_BAR);
        if (mNavigationBarPreference != null) {
            String value = SystemProperties.get("persist.sys.navigationbar.enable", "false");
            mNavigationBarPreference.setChecked(value.equals("true"));
            mNavigationBarPreference.setOnPreferenceChangeListener(this);
        }
    }
 
    @Override
    public void updateState(Preference preference) {
        String value = SystemProperties.get("persist.sys.navigationbar.enable", "false");
        ((SwitchPreference) preference).setChecked(value.equals("true"));
    }
 
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        boolean value = (Boolean) newValue;
        if (DEBUG) {
            Log.d(TAG, "key value " + value);
        }
 
        Intent intent = new Intent();
        if (value) {
            intent.setAction(ACTION_SHOW_NAVIGATION_BAR);
        } else {
            intent.setAction(ACTION_HIDE_NAVIGATION_BAR);
        }
        mContext.sendBroadcast(intent);
        return true;
    }
}

2.修改SystemUi

frameworks/base/packages/SystemUI/AndroidManifest.xml

 <!-- For NavigationBar show or not -->
    <protected-broadcast android:name="com.systemui.navigationbar.show" />
    <protected-broadcast android:name="com.systemui.navigationbar.hide" />

定义广播和对应的系统属性

private static final String ACTION_HIDE_NAVIGATION_BAR = "com.systemui.navigationbar.hide";
    private static final String ACTION_SHOW_NAVIGATION_BAR = "com.systemui.navigationbar.show";
    private static final String SYS_PROPERTY_NAVIGATION_BAR = "persist.sys.navigationbar.enable";

在start方法里,判断属性值,是否加载状态栏

if (SystemProperties.getBoolean(SYS_PROPERTY_NAVIGATION_BAR, false)) {
                    createNavigationBar();
                }

在makeStatusBarView方法里 判断是否加载导航栏

if (SystemProperties.getBoolean(SYS_PROPERTY_NAVIGATION_BAR, false)) {
                    createNavigationBar();
                }

广播接收器处理对应逻辑

else if (ACTION_HIDE_NAVIGATION_BAR.equals(action)) {
                mWindowManager.removeViewImmediate(mNavigationBarView);
                mNavigationBarView = null;
                mStatusBarWindow.setVisibility(View.GONE);
                SystemProperties.set(SYS_PROPERTY_NAVIGATION_BAR, "false");
            } else if (ACTION_SHOW_NAVIGATION_BAR.equals(action)) {
                if(mNavigationBarView == null)
                    createNavigationBar();
                else
                    mNavigationBarView.setVisibility(View.VISIBLE);
                mStatusBarWindow.setVisibility(View.VISIBLE);
                SystemProperties.set(SYS_PROPERTY_NAVIGATION_BAR, "true");
            }

 


目录
相关文章
|
12天前
|
Android开发
Android热补丁动态修复实践,腾讯&字节&网易&华为Android面试题分享
Android热补丁动态修复实践,腾讯&字节&网易&华为Android面试题分享
|
13天前
|
XML Java Android开发
Android控件动态使用 (转)
Android控件动态使用 (转)
11 1
|
13天前
|
Android开发
Android SystemUI去掉拖动亮度条QSPanel界面隐藏功能
Android SystemUI去掉拖动亮度条QSPanel界面隐藏功能
14 0
|
13天前
|
XML 存储 测试技术
Android系统 添加动态控制SystemUI状态栏、导航栏和下拉菜单
Android系统 添加动态控制SystemUI状态栏、导航栏和下拉菜单
66 1
|
13天前
|
Shell Android开发 开发者
Android系统 自定义动态修改init.custom.rc
Android系统 自定义动态修改init.custom.rc
44 0
|
13天前
|
测试技术 Android开发 开发者
RK3568 Android系统客制化动态替换ro任意属性
RK3568 Android系统客制化动态替换ro任意属性
40 1
|
13天前
|
存储 Linux Android开发
RK3568 Android/Linux 系统动态更换 U-Boot/Kernel Logo
RK3568 Android/Linux 系统动态更换 U-Boot/Kernel Logo
117 0
|
13天前
|
Android开发
Android RIL 动态切换 4G 模块适配
Android RIL 动态切换 4G 模块适配
20 0
|
13天前
|
Android开发
Android 动态修改参数配置
Android 动态修改参数配置
15 0
|
13天前
|
安全 Android开发 数据安全/隐私保护
Android中的动态权限请求与最佳实践
【4月更文挑战第14天】 在现代安卓应用开发中,用户隐私和安全被赋予了前所未有的重要性。随着Android 6.0(API级别23)引入的运行时权限模型,开发者必须更加细致地处理权限请求,以确保应用功能的完整性同时不侵犯用户的隐私。本文将深入探讨如何在Android应用中实现动态权限请求,分析常见问题,并提供一系列最佳实践,以帮助开发者优雅地处理这一挑战。
52 5