应用场景:
公司有十几个项目,但源代码只有一份,最近公司要求我在某个项目的(这里用s123代替项目)Settings下加入以太网UI设置,代码写完了,如何智能的控制在哪个项目上显示呢?
难点一:
如何关闭及代开settings里面的以太网接口。
解决:参照settings源代码,在updateHeaderList(updateHeaderList)加载header的时候,会根据Header header = target.get(i); 获取到显示的header (我们可以理解为item),那么int id = (int) header.id; 将获得对应header的ID, 下面就很简单了,贴上以wifi为例的判断是否显示的代码吧。
else if (id == R.id.wifi_settings) {
// Remove WiFi Settings if WiFi service is not available.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)
|| !getResources().getBoolean(R.bool.config_wifi_enable)) {
target.remove(i);
}
}
我们可以看到当header.id==wifi.id时,将判断hasSystemFeature()这个函数,查看源代码后,翻译过来就是在
/system/etc/permissions 下是否有“android.hardware.wifi”这个配置项,删除就不显示! 然后还会判断config_wifi_enable 这个boolean值,这个就是我们需要定义的开关了,定义在values下的config里,所以参照wifi ,我写的代码如下:
else if (id == R.id.ethernet_settings) {
if (!getResources().getBoolean(R.bool.config_show_ethernet)) {
target.remove(i);
}
}
难点二:
如何项目控制我们定义的boolean值呢,这个是问的我们经理。每个项目的UI界面分别有对应的lunch控制的,在目录devices下,项目文件夹下,有个overlay 文件夹,这个文件夹起到的作用就是如果里面有对应程序的配置值,那么这个值将生效,同时对应的app下的值将不生效,而别的项目则还是app下的值生效,这样就有效的分开了不同的UI显示了,如我们公司定义的文件路径。
M:\android-4.4.4_r2\device\leadcore\s123\overlay\leadcore\third-packages\apps\Settings\res\values