当前位置: 首页 > news >正文

Android11 Settings详解

目录

一、系统设置首页(一级菜单)

1、Settings

2、AndroidManifest.xml

3、SettingsHomepageActivity

4、TopLevelSettings

5、top_level_settings.xml

6、DashboardFragment

 二、系统设置二级菜单实现

1、SubSettings

2、SettingsActivity

3、settings_main_prefs.xml

 三、加载默认亮度

1、top_level_settings.xml

2、AndroidManifest.xml

3、DisplaySettings

4、display_settings.xml

5、AutoBrightnessPreferenceController

6、BrightnessLevelPreferenceController

四、字体调节

1、display_settings

2、FontSizePreferenceController

3、ToggleFontSizePreferenceFragment

4、values-zh-rCN/arrays.xml

5、arrays.xml


一、系统设置首页(一级菜单)


1、Settings


        之所以要在此定义空的Activity,是为了外部应用能直接跳转到XX_SettingsActivity界面,因为如果只是fragment的话,外部是没法跳转到fragment界面的,跳转到XX_SettingsActivity时,会执行其父类SettingsActivity.java中的方法,并根据XX_SettingsActivity在清单文件中的注册信息, 它的meta-data的值,找到XX_SettingsActivity对应的fragment(XX_Settings),显示出fragment界面,实现借壳。

2、AndroidManifest.xml


        Settings主界面Activity使用的是Settings.java,子界面Activity使用的是SubSettings.java,Settings与SubSetting中的内部类都是空Activity(没有重写七大生命周期方法),都继承于SettingsActivity.

从AndroidManifest.xml文件中得知主页面是.homepage.SettingsHomepageActivity。

以WifiSettings为例

3、SettingsHomepageActivity


①onCreate


②showFragment
封装方法中进行了加载fragment的实现

4、TopLevelSettings


        TopLevelSettings继承自抽象类DashboardFragment, 实现抽象方法getPreferenceScreenResId()并返回preference的配置文件即可完成静态配置。

TopLevelSettings类中还有一个比较重要的就是在onAttach()方法中调用了父类DashboardFragment的onAttach()方法,这个方法主要是加载preference controllers。

5、top_level_settings.xml


        主标签是一个<PreferenceScreen>标签,里有多个<Preference>标签。每个<Preference>标签对应设置首页的每一个设置项。

6、DashboardFragment


①onCreatePreferences


②refreshAllPreferences


③displayResourceTiles
addPreferencesFromResource方法是将preferenceScreen下所有Preference添加到ArrayList中,然后再根据此集合构建生成PreferenceGroupAdapter,最后将此adapter设置到listview中,完成数据绑定,从而完成界面加载。

④refreshDashboardTiles
⑤onAttach

   @Overridepublic void onAttach(Context context) {super.onAttach(context);mSuppressInjectedTileKeys = Arrays.asList(context.getResources().getStringArray(R.array.config_suppress_injected_tile_keys));mDashboardFeatureProvider = FeatureFactory.getFactory(context).getDashboardFeatureProvider(context);// Load preference controllers from code//从代码加载首选项控制器final List<AbstractPreferenceController> controllersFromCode =createPreferenceControllers(context);// Load preference controllers from xml definition//从 xml 定义加载首选项控制器final List<BasePreferenceController> controllersFromXml = PreferenceControllerListHelper.getPreferenceControllersFromXml(context, getPreferenceScreenResId());// Filter xml-based controllers in case a similar controller is created from code already.//过滤基于 xml 的控制器,以防已经从代码创建了类似的控制器。final List<BasePreferenceController> uniqueControllerFromXml =PreferenceControllerListHelper.filterControllers(controllersFromXml, controllersFromCode);// Add unique controllers to list.//将唯一的控制器添加到列表中if (controllersFromCode != null) {mControllers.addAll(controllersFromCode);}mControllers.addAll(uniqueControllerFromXml);// And wire up with lifecycle.//并与生命周期联系起来。final Lifecycle lifecycle = getSettingsLifecycle();uniqueControllerFromXml.forEach(controller -> {if (controller instanceof LifecycleObserver) {lifecycle.addObserver((LifecycleObserver) controller);}});// Set metrics category for BasePreferenceController.//为 BasePreferenceController 设置指标类别。final int metricCategory = getMetricsCategory();mControllers.forEach(controller -> {if (controller instanceof BasePreferenceController) {((BasePreferenceController) controller).setMetricsCategory(metricCategory);}});mPlaceholderPreferenceController =new DashboardTilePlaceholderPreferenceController(context);mControllers.add(mPlaceholderPreferenceController);for (AbstractPreferenceController controller : mControllers) {addPreferenceController(controller);}}


 
二、系统设置二级菜单实现


1、SubSettings


        系统设置的二级菜单界面Activity是SubSettings类,SubSettings类虽然是一个Activity但是它是一个空的Activity,它不继承Activity7大生命周期。

2、SettingsActivity


①onCreate


布局文件:settings_main_prefs

启动Fragment

②getMetaData


以WifiSettingsActivity为例

③getIntent


④getStartingFragmentClass


⑤launchSettingFragment


⑥switchToFragment

3、settings_main_prefs.xml


        布局文件由<SwitchBar>和<FrameLayout>和<RelativeLayout>标签组成,<RelativeLayout>标签默认是隐藏的。根据<FrameLayout>标签的id可以判断这个标签就是二级菜单栏的主界面内容。

 三、加载默认亮度


1、top_level_settings.xml

2、AndroidManifest.xml

3、DisplaySettings


①getPreferenceScreenResId


②buildPreferenceControllers

4、display_settings.xml

5、AutoBrightnessPreferenceController

6、BrightnessLevelPreferenceController


①getCurrentBrightness


②convertLinearToGammaFloat

四、字体调节


1、display_settings

2、FontSizePreferenceController

3、ToggleFontSizePreferenceFragment

4、values-zh-rCN/arrays.xml

5、arrays.xml



原文链接:https://blog.csdn.net/weixin_47465999/article/details/131596008

相关文章:

  • 【统计术语】
  • Dart 类型系统与 GetX 类型写法完整指南
  • yarn create vite报错:文件名、目录名或卷标语法不正确。 error Command failed.
  • 【嵌入式】鲁班猫玩法大全
  • E结构体基础.go
  • 01.线性代数是如何将复杂的数据结构转化为可计算的数学问题,这个过程是如何进行的
  • FPGA基础 -- Verilog 结构建模之端口的不同位宽处理机制
  • flink如何基于Pekko实现RPC调用
  • openKylin适配RISC-V高性能服务器芯片,携手睿思芯科共拓智算新蓝海
  • ROS学习之动作通信
  • LangChain4j入门学习项目
  • 解决Vue再浏览器的控制台中更新属性不生效
  • Zephyr boot
  • 电池自动点焊机:技术革新下的电池制造核心引擎
  • FastMCP框架进行MCP开发:(一)基础环境搭建及测试
  • 新生活的开启:从 Trae AI 离开后的三个月
  • 如何在 Windows 上实时显示键盘操作?
  • C++ 面向对象特性详解:继承机制
  • Oracle EBS R12.1.3无法打开WEBADI界面
  • WHAT - JavaScript bind vs call vs apply(包括在箭头函数中vs在普通函数中)
  • 外贸网站的公司介绍/小红书seo软件
  • 怎样做网站的优化/泉州百度推广咨询
  • 萧山做网站哪里找/网页是怎么制作的
  • 收费的网站怎么做/营销型网站建设案例
  • 党的建设杂志网站/baidu 百度一下
  • 萌兔网站做代销可靠吗/360优化大师下载官网