上篇文章介紹如何在settings中增加一個新模組,那如何隱藏一個已經存在的模組呢?
阿新 • • 發佈:2019-02-14
你也許會說,這簡單,我直接在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裡邊的佈局載入過程。