Android12 添加设置控制导航栏显示和状态栏下拉

2024-08-30 07:52

本文主要是介绍Android12 添加设置控制导航栏显示和状态栏下拉,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

添加key值

  • 位置: frameworks/base/core/java/android/provider/Settings.java
 /*** Control navigation bar enabled*/@Readable@SuppressLint("NoSettingsProvider")public static final String NAVIGATIONBAR_ENABLED = "navigationbar_enabled";/*** Supoort panel bar expand*/@Readable@SuppressLint("NoSettingsProvider")public static final String SUPPORT_PANELBAR_EXPAND = "support_panelbar_expand";

Setting中添加相关设置项

  • 位置:packages/apps/Settings/res/xml/display_settings.xml
  <SwitchPreferenceandroid:key="navigationbar_enabled"android:title="@string/navigationbar_enabled_title"settings:controller="com.android.settings.display.NavigationbarPreferenceController"/><SwitchPreferenceandroid:key="support_panelbar_expand"android:title="@string/support_panelbar_expand_title"settings:controller="com.android.settings.display.SupportPanelbarExpandPreferenceController"/>  
  • 位置:packages/apps/Settings/res/values/strings.xml
   <string name="navigationbar_enabled_title">Show navigation bar</string><string name="support_panelbar_expand_title">Allows status bar drop-down</string>
  • 位置:packages/apps/Settings/src/com/android/settings/display/NavigationbarPreferenceController.java
package com.android.settings.display;import android.content.Context;
import android.text.TextUtils;import androidx.preference.Preference;import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;import android.provider.Settings;public class NavigationbarPreferenceController extends TogglePreferenceController implementsPreference.OnPreferenceChangeListener {private static final String KEY_NAVIGATIONBAR = "navigationbar_enabled";private Context mContext;private Preference mPreference;public NavigationbarPreferenceController(Context context) {super(context, KEY_NAVIGATIONBAR);mContext = context;}@Overridepublic String getPreferenceKey() {return KEY_NAVIGATIONBAR;}@Overridepublic void updateState(Preference preference) {mPreference = preference;super.updateState(preference);}@Overridepublic int getAvailabilityStatus() {return AVAILABLE/* : UNSUPPORTED_ON_DEVICE*/;}@Overridepublic boolean isChecked() {int status = Settings.System.getInt(mContext.getContentResolver(), Settings.System.NAVIGATIONBAR_ENABLED, 0);return status==1;}@Overridepublic boolean setChecked(boolean isChecked) {Settings.System.putInt(mContext.getContentResolver(), Settings.System.NAVIGATIONBAR_ENABLED, isChecked ? 1:0);return true;}
}

在屏幕顶部和中间下滑都可以拉出状态栏,所以有两个地方需要修改。你也可以直接在CommandQueue.java的panelsEnabled()方法中做控制

  • 位置:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
	@Overridepublic boolean onTouchEvent(MotionEvent event) {// add startint supportExpand = Settings.System.getInt(mContext.getContentResolver(), Settings.System.SUPPORT_PANELBAR_EXPAND, 0);if (supportExpand == 0){return true;}// endboolean barConsumedEvent = mBar.interceptTouchEvent(event);if (DEBUG_GESTURES) {if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {EventLog.writeEvent(EventLogTags.SYSUI_PANELBAR_TOUCH,event.getActionMasked(), (int) event.getX(), (int) event.getY(),barConsumedEvent ? 1 : 0);}}return barConsumedEvent || super.onTouchEvent(event);}
  • 位置:packages/apps/Launcher3/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java
	private void dispatchTouchEvent(MotionEvent ev) {// add startint supportExpand = Settings.System.getInt(mLauncher.getContentResolver(), Settings.System.SUPPORT_PANELBAR_EXPAND, 0);if (mSystemUiProxy.isActive() && supportExpand==1) {// add endmLastAction = ev.getActionMasked();mSystemUiProxy.onStatusBarMotionEvent(ev);}}

导航栏显示的控制

  • frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
	// add startimport android.content.ContentResolver;import android.database.ContentObserver;import android.provider.Settings;// end...// add startprivate final Object mLock = new Object();private SettingsObserver mSettingsObserver;private boolean mSupportPanelExpand;private boolean mShowNavigationbar;// end...// add startprivate final class SettingsObserver extends ContentObserver {public SettingsObserver(Handler handler) {super(handler);}@Overridepublic void onChange(boolean selfChange, Uri uri) {synchronized (mLock) {updateSettingsLocked();if (mShowNavigationbar){createNavigationBar(null);} else {removeNavigationBar();}}}}private void updateSettingsLocked() {final ContentResolver resolver = mContext.getContentResolver();mShowNavigationbar = (Settings.System.getInt(resolver,Settings.System.NAVIGATIONBAR_ENABLED, 0)) == 1;}   // add end// ================================================================================// Constructing the view// ================================================================================protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) {final Context context = mContext;updateDisplaySize(); // populates mDisplayMetricsupdateResources();updateTheme();...// add start// Register for settings changes.mSettingsObserver = new SettingsObserver(mHandler);final ContentResolver resolver = mContext.getContentResolver();resolver.registerContentObserver(Settings.System.getUriFor(Settings.System.NAVIGATIONBAR_ENABLED),false, mSettingsObserver);updateSettingsLocked();if (mShowNavigationbar){createNavigationBar(result);}// add end}...protected void createNavigationBar(@Nullable RegisterStatusBarResult result) {mNavigationBarController.createNavigationBars(true /* includeDefaultDisplay */, result);}// add startprotected void removeNavigationBar() {mNavigationBarController.removeNavigationBar();}// add end
  • 位置:frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
	// add startpublic void removeNavigationBar() {Display[] displays = mDisplayManager.getDisplays();for (Display display : displays) {removeNavigationBar(display.getDisplayId());}}// add end

配置默认值

  • 位置:frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
	private void loadSystemSettings(SQLiteDatabase db) {SQLiteStatement stmt = null;try {stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"+ " VALUES(?,?);");loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,R.bool.def_dim_screen);loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,R.integer.def_screen_off_timeout);// add startloadBooleanSetting(stmt, Settings.System.NAVIGATIONBAR_ENABLED,R.bool.def_navigationbar_enabled);loadBooleanSetting(stmt, Settings.System.SUPPORT_PANELBAR_EXPAND,R.bool.def_support_panelbar_expand);// end        ...}
  • frameworks/base/packages/SettingsProvider/res/values/defaults.xml
	// add start<bool name="def_navigationbar_enabled">false</bool><bool name="def_support_panelbar_expand">false</bool>// end

这篇关于Android12 添加设置控制导航栏显示和状态栏下拉的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120226

相关文章

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)