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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值