Android修改分析:删除设置中菜单

设置中的菜单主要分为两种添加方式:

``

1.静态加载

所谓自主添加,就是通过xml文件,自主通过添加布局到Fragment、Activity等加载到设置菜单中。一般每个自主添加菜单都拥有一个Controller。主要分为以下两种情况处理:

1.拥有Conroller

@Override

public boolean isAvailable() {

return false;

} // 通过继承类往上查找,发现实际上去除布局的方式仍然是调用了removePreference函数来删除控件

2.没有Controller

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle)

final PreferenceScreen screen = getPreferenceScreen();

Preference backupPref = screen.findPreference("backup_settings");

screen.removePreference(backupPref);

}

2.动态加载

所谓动态加载,就是说菜单不是通过xml文件自主定义添加的内容,而是通过Category来动态加载布置在各个应用下的菜单页面。

vendor

vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/notification/SoundSettings.java

public class SoundSettings extends DashboardFragment implements OnActivityResultListener {

private static final String TAG = "SoundSettings";

......

}

vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/dashboard/DashboardFragment.java

@VisibleForTesting

void refreshDashboardTiles(final String TAG) {

final PreferenceScreen screen = getPreferenceScreen();

final DashboardCategory category =

mDashboardFeatureProvider.getTilesForCategory(getCategoryKey());

if (category == null) {

Log.d(TAG, "NO dashboard tiles for " + TAG);

return;

}

final ListTile tiles = category.getTiles();

if (tiles == null) {

Log.d(TAG, "tile list is empty, skipping category " + category.key);

return;

}

// Create a list to track which tiles are to be removed.

final ListString remove = new ArrayList(mDashboardTilePrefKeys);

// There are dashboard tiles, so we need to install SummaryLoader.

if (mSummaryLoader != null) {

mSummaryLoader.release();

}

final Context context = getContext();

mSummaryLoader = new SummaryLoader(getActivity(), getCategoryKey());

mSummaryLoader.setSummaryConsumer(this);

// Install dashboard tiles.

final boolean forceRoundedIcons = shouldForceRoundedIcon();

for (Tile tile : tiles) {

final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile);

if (TextUtils.isEmpty(key)) {

Log.d(TAG, "tile does not contain a key, skipping " + tile);

continue;

}

if (!displayTile(tile)) {

continue;

}

if (mDashboardTilePrefKeys.contains(key)) {

// Have the key already, will rebind.

final Preference preference = screen.findPreference(key);

mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), forceRoundedIcons,

getMetricsCategory(), preference, tile, key,

mPlaceholderPreferenceController.getOrder());

} else {

// Don't have this key, add it.

final Preference pref = new Preference(getPrefContext());

mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), forceRoundedIcons,

getMetricsCategory(), pref, tile, key,

mPlaceholderPreferenceController.getOrder());

screen.addPreference(pref);

mDashboardTilePrefKeys.add(key);

}

remove.remove(key);

}

// Finally remove tiles that are gone.

for (String key : remove) {

mDashboardTilePrefKeys.remove(key);

final Preference preference = screen.findPreference(key);

if (preference != null) {

screen.removePreference(preference);

}

}

mSummaryLoader.setListening(true);

}

vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java

PARENT_TO_CATEGORY_KEY_MAP.put(AppAndNotificationDashboardFragment.class.getName(),

CategoryKey.CATEGORY_APPS);

PARENT_TO_CATEGORY_KEY_MAP.put(PowerUsageSummary.class.getName(),

CategoryKey.CATEGORY_BATTERY);

PARENT_TO_CATEGORY_KEY_MAP.put(DisplaySettings.class.getName(),

CategoryKey.CATEGORY_DISPLAY);

PARENT_TO_CATEGORY_KEY_MAP.put(SoundSettings.class.getName(),

CategoryKey.CATEGORY_SOUND);

PARENT_TO_CATEGORY_KEY_MAP.put(StorageDashboardFragment.class.getName(),

CategoryKey.CATEGORY_STORAGE);

PARENT_TO_CATEGORY_KEY_MAP.put(SecuritySettings.class.getName(),

CategoryKey.CATEGORY_SECURITY);

PARENT_TO_CATEGORY_KEY_MAP.put(AccountDetailDashboardFragment.class.getName(),

CategoryKey.CATEGORY_ACCOUNT_DETAIL);

PARENT_TO_CATEGORY_KEY_MAP.put(AccountDashboardFragment.class.getName(),

CategoryKey.CATEGORY_ACCOUNT);

frameworks

frameworks/base/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java

public static final String CATEGORY_STORAGE = "com.android.settings.category.ia.storage";

public static final String CATEGORY_SECURITY = "com.android.settings.category.ia.security";

packages

packages/apps/Car/Settings/res/xml/sound_settings_fragment.xml

com.android.car.settings.common.LogicalPreferenceGroup

android:key="@string/pk_sounds_extra_settings"

settings:controller="com.android.car.settings.common.ExtraSettingsPreferenceController"

intent android:action="com.android.settings.action.EXTRA_SETTINGS"

extra android:name="com.android.settings.category"

android:value="com.android.settings.category.ia.sound"/

/intent

Android修改分析:删除设置中菜单 相关文章

持续集成CI入门篇(二)

WAR包 一丶修改.gitlab-ci.yml stages: - testtest: stage: test script: - echo 执行打包命令 - /usr/local/maven/apache-maven-3.6.3/bin/mvn package - echo 复制到docker目录 - cp target/TestCICD-1.0-SNAPSHOT.war docker/TestCICD.war - echo 停止服

使用 Android 的日志工具 Log

?Log简介 Android中的日志工具类是Log,这个类中提供了5个方法来供我们打印日志: 1. $Log.v()$ 用于打印那些最为琐碎的,意义最小的日志信息 对应级别 verbose,是 Android 日志里面级别最低的一种 2. $Log.d()$ 用于打印一些调试信息,这些信息对你调试程

Android Studio详解项目中的资源

?目录结构 ?作用 所有以 drawable 开头的文件都是用来放图片的; 所有以 mipmap 开头的文件都是用来放应用图标的; 所有以 value 开头的文件夹都是用来放字符串、样式、颜色等配置的; layout 文件夹用来放布局文件; 之所以有这么多 mipmap 开头的文件夹,

Android java层常见加密算法的hook自吐以及栈信息的打印

杂谈:其实原理并没有很难,本质就是hook Android的框架层中的api将我们想要的key和iv(也可以没有,就打个比方),但是目前的话,很多厂家已经不在直接调用java层的这些加密算法的api了, 很多都是使用自己实现的加密算法,要么就是放在so里面,要么就是java

CBlock类的GetHash函数分析

GetHash声明 src\primitives\block.h uint256 GetHash() const; GetHash定义 调用SerializeHash函数 *this指向CBlock对象 src\primitives\block.cpp uint256 CBlockHeader::GetHash() const{ return SerializeHash(*this);} SerializeHash函数 计算obj对象的

Linux 修改 ELF 解决 glibc 兼容性问题

Linux glibc 问题 相信有不少 Linux 用户都碰到过运行第三方(非系统自带软件源)发布的程序时的 glibc 兼容性问题,这一般是由于当前 Linux 系统上的 GNU C 库(glibc)版本比较老导致的,例如我在 CentOS 6 64 位系统上运行某第三方闭源软件时会报: [root

redis6.0.5之zset阅读笔记2--跳跃列表(zshiplist)之论文翻译2算法分析(这部分读的有点辛苦)

ANALYSIS OF SKIP LIST ALGORITHMS 跳跃链表的算法分析The time required to execute the Search, Delete and Insert operations is dominated by the time required to search for the appropriate element.For the Insert and Delete operations,there is

Apply Changes 在 Android 11 中的增强特性

简介 Apply Changes 是 Android Studio 中的一项功能,我们在 Android Studio 3.5 中引入了这项功能,以帮助开发者快速迭代您对应用所做的更改。Apply Changes 通过 JVMTI API 来判断是否可以使用此方式进行变更。在 Android 11 上,ART (Android 运行时) 扩

NB-IoT应用分类与技术特点分析

NB-Iot作为一种窄带物联网技术在各大行业脱颖而出,其应用涵盖多个领域。此文计讯小编将讲解NB-IoT的主要应用分类及相关特点。??一、NB-IoT是什么??NB-IoT是指窄带物联网(Narrow Band -Internet of Things)技术。NB-IOT聚焦于低功耗广覆盖(LPWA)物联网(IoT)

android studio 自带的LoginActivity 添加登陆

新手入门,想看看AS自带的DEMO怎么写的,于是在AS中新建工程时选择了LoginActivity。关于LoginActivity的分析,网上可以找到。直接上我改过的代码。 package com.example.myapplication.data;import android.util.Log;import com.example.myapplication.data

android菜单更改,Android修改分析:删除设置中菜单相关推荐

  1. DDL-操作数据库、操作数据表、DML-增加、修改、删除表中数据、DQL-表数据查询

    SQL 语句分类: DDL(Data Definition Language) :数据定义语言.用来操作数据库,表,列等. DML(Data Manipulation Language) :数据操作语 ...

  2. 高通 Android 12/13 默认修改中文语言设置

    1.源码路径build/make/target/product/full_base.mk,修改参数PRODUCT_LOCALES:后面你要修改的语言修改其他默认语言一样,举一反三即可.如下图所示 2. ...

  3. Android 系统默认铃声修改 添加删除铃声

    Android 7.0 修改系统默认铃声: build\target\product\full_base.mk ro.config.ringtone=14_Snowflakes.ogg \ ro.co ...

  4. 如何修改以及删除数据库中的表

    修改删除表 修改表: -- 修改表名 ALTER TABLE 旧表名 RENAME AS 新表名 ALTER TABLE teacher RENAME AS teacher1;-- 增加表的字段 AL ...

  5. oracle 如何删除表列,Oracle中增加,修改,删除表中的列

    内核对TCP REUSEPORT的优化 Q&A 当有人问起我关于reuseport的一些事的时候,我们的对话基本如下:Q1:什么是reuseport?A1:reuseport是一种套接字复用机 ...

  6. Android如何更改app图标

    Android如何更改app图标 AndroidManifest.xml文件中更改icon的图标就可以了

  7. android视图工具栏,Android studio预览视图工具栏不见了

    解决办法1: 查看 - >工具窗口 - >预览 解决办法2: 1.双击shift或者右上角的搜索图标 2.输入preview 3.单击该选项 搜索preview 观看previewtool ...

  8. 论文阅读笔记(四)——实例分割与掩模R-CNN应用于多摄像机设置中松散的奶牛

    Instance Segmentation with Mask R-CNN Applied to Loose-Housed Dairy Cows in a Multi-Camera Setting 简 ...

  9. Android修改系统默认设置

     1.launcher的布局太居中,要想两边拉伸 <\packages\apps\Launcher2\res\values\dimens.xml> <dimen name=&qu ...

最新文章

  1. findContours函数
  2. Atom编写Markdown
  3. if语句的一个错误记录,多了个“;”号
  4. .net中流的概念!
  5. jzoj6451-[2020.01.19NOIP提高组]不幸运数字【记忆化搜索,数位dp,高精度】
  6. 入门云虚拟主机,为你的业务快速实现数据备份和数据恢复
  7. 基于Mesos/Docker构建数据处理平台
  8. MySQL (9)---数据类型
  9. a*算法路径规划matlab_【优化求解】基于栅格地图——遗传算法的机器人最优路径规划...
  10. ASP.net:URL重写实现IHttpHandler接口
  11. 工商银行的计算机网络布线,工商银行利用计算机网络开展了哪些业务?
  12. xdb 服务_[20200115]监听中没有xdb服务.txt
  13. Vista 自动激活工具(最新 最权威 所有版本 可升级)
  14. 阿里云域名SSL证书安装
  15. vue.js中的created()与activated()的用法
  16. 2019暑期建模培训简单总结
  17. SUS铝合金复合金属的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. 数据库导入表时出错:Importing tables....errors detected(see log page)
  19. Ubuntu14.04 64位+Python3.4环境下安装matplotlib的方法
  20. 中值定理1----利用罗尔中值定理解题的一般步骤

热门文章

  1. [Python] 字符串大写变小写 lower()函数
  2. 将图片转化为txt文本显示
  3. Extjs grid禁用头部点击三角下拉菜单
  4. AngularJS------报错The selector app-user-item did not match any elements
  5. 2017-10-湖南套题1
  6. JAVA中的hasNextInt()方法多次调用只有一个结果的原因
  7. [转载] python数字类型(一)
  8. [转载] 【python系列】numpy中的tile函数
  9. [转载] 50个数据可视化最有价值的图表(附完整Python代码,建议收藏)
  10. [转载] python的__del__()方法