您的位置:首页 > 其它

上篇文章介绍如何在settings中增加一个新模块,那如何隐藏一个已经存在的模块呢?

2017-02-23 11:36 525 查看

你也许会说,这简单,我直接在xml/dash_category.xml里删掉或注释掉就好了,但还有一种情况,就是万一这个模块,在其他代码中使用了其中的id,现在你注释或删除此块代码,牵一发而动全身,总不能把所有用到此id的代码都注释掉吧。

接下来告诉你一种隐藏方式,不难,但你自己找也要费点劲的。

要想隐藏掉某个模块,你还是要从它的整个模块加载流程入手,为什么我布局放到那就能好是,它的fragment层级机构是什么样子的,为什么我点击一下直接可以掉转到我想要的fragment 界面去。

它首先通过一下方法加载并部署该dashboradcagegory

SettingsActivity.java

categories) { hljs avrasm">1079         categories.clear();
1080         loadCategoriesFromResource(R.xml.dashboard_categories, categories);
1081         updateTilesList(categories);
1082     }


先调用loadCagegoriesFromResource加载该布局

然后有个updateTilesList(categories);的过程,接下来我们关注这个点

target) { hljs objectivec">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+
4000
+) {
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里边的布局加载过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐