你也许会说,这简单,我直接在xml/dash_category.xml里删掉或注释掉就好了,但还有一种情况,就是万一这个模块,在其他代码中使用了其中的id,现在你注释或删除此块代码,牵一发而动全身,总不能把所有用到此id的代码都注释掉吧。
接下来告诉你一种隐藏方式,不难,但你自己找也要费点劲的。
- 要想隐藏掉某个模块,你还是要从它的整个模块加载流程入手,为什么我布局放到那就能好是,它的fragment层级机构是什么样子的,为什么我点击一下直接可以掉转到我想要的fragment 界面去。
- 它首先通过一下方法加载并部署该dashboradcagegory
SettingsActivity.java
1079 categories.clear();
1080 loadCategoriesFromResource(R.xml.dashboard_categories, categories);
1081 updateTilesList(categories);
1082 }
- 先调用loadCagegoriesFromResource加载该布局
然后有个updateTilesList(categories);的过程,接下来我们关注这个点
1235 final boolean showDev = mDevelopmentPreferences.getBoolean(
1236 DevelopmentSettings.PREF_SHOW,
1237 android.os.Build.TYPE.equals("eng"));
1238
1239 final UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
1240
1241 final int size = target.size();
1242 for (int i = 0; i < size; i++) {
1243
1244 DashboardCategory category = target.get(i);
1245
1246 // Ids are integers, so downcasting is ok
1247 int id = (int) category.id;
1248 int n = category.getTilesCount() - 1;
1249 while (n >= 0) {
1250
1251 DashboardTile tile = category.getTile(n);
1252 boolean removeTile = false;
1253 id = (int) tile.id;
1254 if (id == R.id.operator_settings || id == R.id.manufacturer_settings) {
1255 if (!Utils.updateTileToSpecificActivityFromMetaDataOrRemove(this, tile)) {
1256 removeTile = true;
1257 }
1258 } else if (id == R.id.wifi_settings) {
1259 // Remove WiFi Settings if WiFi service is not available.
1260 if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {
1261 removeTile = true;
1262 }
1263 } else if (id == R.id.bluetooth_settings) {
1264 // Remove Bluetooth Settings if Bluetooth service is not available.
1265 if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
1266 removeTile = true;
1267 }
1268 } else if (id == R.id.data_usage_settings) {
1269 // Remove data usage when kernel module not enabled
1270 final INetworkManagementService netManager = INetworkManagementService.Stub
1271 .asInterface(ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE));
.............................
} else if (id == R.id.privacy_settings) {
1301 removeTile = true;
1302 } else if (id == R.id.apps_compatibility_settings) {
1303 removeTile = true;
1304 } else if (id == R.id.jabol_settings) {
1305 removeTile = true;
里边有个判断,如果是这个Id,我们对removeTile有个赋值操作,为true则表示在Settings的布局不再显示该条目,达到隐藏的目的。
- 具体实现机理,有兴趣的可以子先研究下Settings里边的布局加载过程。