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

 


目录
相关文章
|
3月前
|
API Android开发 开发者
Android经典实战之用WindowInsetsControllerCompat方便的显示和隐藏状态栏和导航栏
本文介绍 `WindowInsetsControllerCompat` 类,它是 Android 提供的一种现代化工具,用于处理窗口插入如状态栏和导航栏的显示与隐藏。此类位于 `androidx.core.view` 包中,增强了跨不同 Android 版本的兼容性。主要功能包括控制状态栏与导航栏的显示、设置系统窗口行为及调整样式。通过 Kotlin 代码示例展示了如何初始化并使用此类,以及如何设置系统栏的颜色样式。
194 2
|
3月前
|
API Android开发 Kotlin
Android实战经验分享之如何获取状态栏和导航栏的高度
在Android开发中,掌握状态栏和导航栏的高度对于优化UI布局至关重要。本文介绍两种主要方法:一是通过资源名称获取,简单且兼容性好;二是利用WindowInsets,适用于新版Android,准确性高。文中提供了Kotlin代码示例,并对比了两者的优缺点及适用场景。
313 1
|
4月前
|
XML Android开发 数据格式
Android面试题之DialogFragment中隐藏导航栏
在Android中展示全屏`DialogFragment`并隐藏状态栏和导航栏,可通过设置系统UI标志实现。 记得在布局文件中添加内容,并使用`show()`方法显示`DialogFragment`。
63 2
|
5月前
|
Android开发
Android中如何动态的调整Dialog的背景深暗
在Android开发中,Dialog和DialogFragment可通过设置`Window`的`backgroundDimAmount`来控制背景变暗,突出对话框。在DialogFragment的`onCreateDialog`或`onViewCreated`中,获取`Dialog`的`Window`,设置`LayoutParams.dimAmount`(例如0.5f)并添加`FLAG_DIM_BEHIND`标志。要动态调整,可保存`LayoutParams`并在需要时更新。对于Dialog,创建时直接设置同样属性。还可以通过定义主题样式设置背景模糊程度。
146 7
|
5月前
|
XML Java Android开发
Android RecyclerView用代码动态设置item的selector
Android RecyclerView用代码动态设置item的selector
41 0
|
6月前
|
XML Java Android开发
Android控件动态使用 (转)
Android控件动态使用 (转)
40 1
|
6月前
|
XML 存储 测试技术
Android系统 添加动态控制SystemUI状态栏、导航栏和下拉菜单
Android系统 添加动态控制SystemUI状态栏、导航栏和下拉菜单
1107 1
|
6月前
|
Android开发
Android热补丁动态修复实践,腾讯&字节&网易&华为Android面试题分享
Android热补丁动态修复实践,腾讯&字节&网易&华为Android面试题分享
|
6月前
|
Android开发
Android SystemUI去掉拖动亮度条QSPanel界面隐藏功能
Android SystemUI去掉拖动亮度条QSPanel界面隐藏功能
125 0
|
6月前
|
Android开发
安卓动态申请权限
安卓动态申请权限
49 0