1. 程式人生 > >上篇文章介紹如何在settings中增加一個新模組,那如何隱藏一個已經存在的模組呢?

上篇文章介紹如何在settings中增加一個新模組,那如何隱藏一個已經存在的模組呢?

你也許會說,這簡單,我直接在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裡邊的佈局載入過程。