设置中的一级菜单加载主要由DashboardFragment加载

第三方菜单加载(DashboardFeatureProviderImpl):

@Overridepublic List<DynamicDataObserver> bindPreferenceToTileAndGetObservers(FragmentActivity activity,boolean forceRoundedIcon, int sourceMetricsCategory, Preference pref, Tile tile,String key, int baseOrder) {if (pref == null) {return null;}if (!TextUtils.isEmpty(key)) {pref.setKey(key);} else {pref.setKey(getDashboardKeyForTile(tile));}final List<DynamicDataObserver> outObservers = new ArrayList<>();DynamicDataObserver observer = bindTitleAndGetObserver(pref, tile);if (observer != null) {outObservers.add(observer);}observer = bindSummaryAndGetObserver(pref, tile);if (observer != null) {outObservers.add(observer);}observer = bindSwitchAndGetObserver(pref, tile);if (observer != null) {outObservers.add(observer);}bindIcon(pref, tile, forceRoundedIcon);if (tile instanceof ActivityTile) {final Bundle metadata = tile.getMetaData();String clsName = null;String action = null;if (metadata != null) {clsName = metadata.getString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS);action = metadata.getString(META_DATA_KEY_INTENT_ACTION);}if (!TextUtils.isEmpty(clsName)) {pref.setFragment(clsName);} else {final Intent intent = new Intent(tile.getIntent());intent.putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY,sourceMetricsCategory);if (action != null) {intent.setAction(action);}pref.setOnPreferenceClickListener(preference -> {launchIntentOrSelectProfile(activity, tile, intent, sourceMetricsCategory);return true;});}}if (tile.hasOrder()) {final String skipOffsetPackageName = activity.getPackageName();final int order = tile.getOrder();boolean shouldSkipBaseOrderOffset = TextUtils.equals(skipOffsetPackageName, tile.getIntent().getComponent().getPackageName());if (shouldSkipBaseOrderOffset || baseOrder == Preference.DEFAULT_ORDER) {pref.setOrder(order);} else {pref.setOrder(order + baseOrder);}}return outObservers.isEmpty() ? null : outObservers;}

bindIcon()方法就是为第三方菜单添加背景的:

@VisibleForTestingvoid bindIcon(Preference preference, Tile tile, boolean forceRoundedIcon) {if (tile.getMetaData() != null&& tile.getMetaData().containsKey(META_DATA_PREFERENCE_ICON_URI)) {// Set a transparent color before starting to fetch the real icon, this is necessary// to avoid preference padding change.&& tile.getMetaData().containsKey(META_DATA_PREFERENCE_ICON_URI)));setPreferenceIcon(preference, tile, forceRoundedIcon, mContext.getPackageName(),Icon.createWithResource(mContext, android.R.color.transparent));ThreadUtils.postOnBackgroundThread(() -> {final Intent intent = tile.getIntent();String packageName = null;if (!TextUtils.isEmpty(intent.getPackage())) {packageName = intent.getPackage();} else if (intent.getComponent() != null) {packageName = intent.getComponent().getPackageName();}final Map<String, IContentProvider> providerMap = new ArrayMap<>();final Uri uri = TileUtils.getCompleteUri(tile, META_DATA_PREFERENCE_ICON_URI,METHOD_GET_PROVIDER_ICON);final Pair<String, Integer> iconInfo = TileUtils.getIconFromUri(mContext, packageName, uri, providerMap);if (iconInfo == null) {return;}final Icon icon = Icon.createWithResource(iconInfo.first, iconInfo.second);ThreadUtils.postOnMainThread(() -> {setPreferenceIcon(preference, tile, forceRoundedIcon, iconInfo.first, icon);});});return;}// Use preference context instead here when get icon from Tile, as we are using the context// to get the style to tint the icon. Using mContext here won't get the correct style.final Icon tileIcon = tile.getIcon(preference.getContext());if (tileIcon == null) {return;}setPreferenceIcon(preference, tile, forceRoundedIcon, tile.getPackageName(), tileIcon);}

代码中我们可以看到,setPreferenceIcon()会为菜单图标添加背景颜色

 private void setPreferenceIcon(Preference preference, Tile tile, boolean forceRoundedIcon,String iconPackage, Icon icon) {Drawable iconDrawable = icon.loadDrawable(preference.getContext());Boolean flag = mContext.getResources().getBoolean(R.bool.config_menu_icons_background);if (!flag&&TextUtils.equals(tile.getCategory(), CategoryKey.CATEGORY_HOMEPAGE)) {iconDrawable.setTint(Utils.getHomepageIconColor(preference.getContext()));} else if (flag&&forceRoundedIcon && !TextUtils.equals(mContext.getPackageName(),iconPackage)) {iconDrawable = new AdaptiveIcon(mContext, iconDrawable,R.dimen.dashboard_tile_foreground_image_inset);((AdaptiveIcon) iconDrawable).setBackgroundColor(mContext, tile);}preference.setIcon(iconDrawable);}

本地菜单图标数据加载TopLevelSettings.java中的onCreatePreferences方法进行加载

 @Overridepublic void onCreatePreferences(Bundle savedInstanceState, String rootKey) {super.onCreatePreferences(savedInstanceState, rootKey);  setBackgroundForIcon();}

在onCreatePreferences中通过setBackgroundForIcon方法去设置图标

private void setBackgroundForIcon(){Context mContext = getContext();    final PreferenceScreen screen = getPreferenceScreen();if (screen == null) {return;}// Tint the homepage iconsfinal int tintColor = Utils.getHomepageIconColor(mContext);final int count = screen.getPreferenceCount();Random r=new Random();int array[]= {R.color.homepage_network_background,R.color.homepage_connected_device_background,R.color.homepage_app_and_notification_background,R.color.homepage_battery_background,R.color.homepage_display_background,R.color.homepage_sound_background,R.color.homepage_storage_background,R.color.homepage_security_background,R.color.homepage_accounts_background,R.color.homepage_accessibility_background,R.color.homepage_emergency_background,R.color.homepage_system_background,R.color.homepage_support_background,R.color.homepage_generic_icon_background,R.color.homepage_location_background,R.color.homepage_about_background,R.color.homepage_privacy_background,R.color.homepage_wallpaper_background,R.color.homepage_notification_background};for (int i = 0; i < count; i++) {final Preference preference = screen.getPreference(i);if (preference == null) {break;}Drawable icon = preference.getIcon();           if (icon != null) {if(mContext.getResources().getBoolean(R.bool.config_menu_icons_background)){icon.setTint(0xffffffff);              icon = new AdaptiveIcon(mContext, icon);  int index = i<array.length? i:r.nextInt(array.length);((AdaptiveIcon) icon).setBackgroundColor(mContext.getColor(array[index]));          }else{  icon.setTint(tintColor);  }preference.setIcon(icon);  }}}

设置的一级菜单图标添加背景相关推荐

  1. Android7.0高级设置修改一级菜单分类和显示顺序并跳转第三方应用

    在android 盒子定制开发中,时常会遇到需要修改高级设置Settings内容的需求,比如在海思3798MV200方案中,"显示"菜单和"高级设置"菜单都是调 ...

  2. qt中添加资源文件以及添加菜单图标、工具栏中菜单的快捷方式、窗口以及对话框的icon

    1.file--new-QT resource file,就会在工程中添加一个资源文件,然后单击Add下拉框,选择Add prefix,可以将生成的/new/prefix的后缀改为其他的名字,如fil ...

  3. 利用xfce4给ubuntu终端添加背景图片

    利用xfce4给ubuntu终端添加背景图片 动机 一.xfce4的安装 二.设置xfce4为默认终端 三.设置xfce4终端字体及添加背景图片 四.彻底卸载xfce4的方法 动机 我使用xfce4的 ...

  4. 公众号图文消息加html,微信公众号图文排版,如何给文章或者段落添加背景图?...

    你知道如何给微信公众号文章添加背景嘛?今天就从两个方面来分享如何给微信公众号文章添加背景. 一.给全文添加背景 首先分享的是给整篇文章添加背景,点击顶部工具栏的插背景按钮可为全文添加背景: 有纯色背景 ...

  5. element-ui的 Dialog 对话框添加背景图片

    el-dialog的默认背景为 白色 ,我们将其设置为透明.并添加背景图片.el-dialog__header.el-dialog__body.el-dialog__footer背景设置为透明,即可. ...

  6. MFC实战篇——图片旋转、控件PictureControl 清除显示、伪彩、直方图显示、为按钮添加背景图标、设置程序图标

    文章目录 一.图片旋转 二.MFC 控件PictureControl 清除显示 三.伪彩 四.直方图 五.为按钮添加背景图标 六.设置图标 七.改变组框外观 一.图片旋转 建立图片控件 改变图片控件I ...

  7. 在Qt中添加菜单图标

    第一步:新建Qt Widgets Application,取合适的项目名称,基类选择QMainWindow,类名为MainWindow. 第二步:创建完项目后,双击mainwindow.ui文件进入设 ...

  8. 【Qt入门第4篇】 基础(四)添加菜单图标——使用Qt资源文件

    导语 后面几篇里我们将介绍常用的Qt主窗口部件QMainWindow,主窗口部件就是一般的应用程序主窗口,它包含了菜单栏.工具栏.中心部件.状态栏和可停靠部件等.这一篇将着重介绍菜单的实现以及使用资源 ...

  9. android+主界面所有应用程序图标添加统一背景主题,Android 4.0替Launcher主界面所有应用程序图标添加统一背景主题...

    当前位置:我的异常网» Android » Android 4.0替Launcher主界面所有应用程序图标添加 Android 4.0替Launcher主界面所有应用程序图标添加统一背景主题 www. ...

最新文章

  1. 科技|全球首款飞行汽车开始量产!下月开始预售,2023年后或可实现一键打“飞车”...
  2. 一步一步学Silverlight 2系列(20):如何在Silverlight中与HTML DOM交互(下)
  3. mysql基本的增删改查和条件语句
  4. 【杂记】我为什么要坚持写博客
  5. Jquery调用Web Service
  6. [WCF权限控制]WCF的三种授权模式
  7. PyTorch实现CNN
  8. 【数据预测】基于matlab双向长短时记忆(BiLSTM)数据预测【含Matlab源码 1824期】
  9. SoapUI WebService 接口测试
  10. Linux 命令(244)—— reset 命令
  11. 计算机音乐创作心得,理结与悠的作曲入门讲座(心得篇 3-4)
  12. 摔鸡蛋,摔手机问题。
  13. 如何恢复移动硬盘损坏的数据?先找原因后解决
  14. RT-Thread 模拟器 simulator 搭建 LVGL 的开发调试环境
  15. 4G DTU和4G工业路由器有哪些区别?
  16. 【软件测试】什么样的项目适合做自动化测试?自动化测试有需要那些技术?
  17. jquery手写table行列自动计算(自动计算小计和合计)
  18. oracle 表分区 date,ORACLE分区表的使用和管理
  19. 计算机视觉注意力网络(三)——CBAM [ECCV 2018]
  20. sha1安全码校验工具(apk)

热门文章

  1. GerbView生产高级软件,支持新旧表单
  2. html发送邮件代码主题主题乱码,Java发送邮件时标题和发件人乱码
  3. JS实现简易留言板功能
  4. 向量,标量对向量求导数
  5. [MATLAB学习笔记] MATLAB里 ‘Markersize’ 设置的值是‘Marker_size’
  6. Java基础题30:(单选题)在控制台显示消息的语句正确的是( )
  7. 我偶尔会用到的调试方法 | Linux 内核
  8. Metasploit(MSF)实战_永恒之蓝漏洞拿下win7靶机
  9. C++_Leetcode刷题之路——简单(持续更新)
  10. 如何找回U盘清理了的文件