最近再研究Android应用的夜间模式,总结一下:
夜间模式的主旨就是用代码实现调用不同的.xml文件或者不同的资源文件。当然,皮肤,主题什么的都可以这么实现。
第一种:(sdk2.2+)UiModeManager
傻瓜式的,新建layout-night文件夹,里面加入需要夜间模式的layout.xml文件,然后系统会根据UiMode自动获取layout或者layout-night中的布局文件
UiModeManager是Android SDK2.2提供的一种对于手机UI控制的Manager,其中提供了进入行车(carMode)的方法,其实整个手机硬件内置了集中模式,主要是:UI_MODE_TYPE_UNDEFINED,UI_MODE_TYPE_NORMAL,UI_MODE_TYPE_DESK,UI_MODE_TYPE_CAR,UI_MODE_TYPE_TELEVISION。默认是normal的~虽然UiMode内置了夜间模式,但是只能够在CAR模式的时候运用...也就是说你要试用夜间模式,必须要将currentMode设置成UI_MODE_TYPE_CAR,具体方法如下。
UiModeManager uim = (UiModeManager) getSystemService(Context.UI_MODE_SERVICE);
int i = uim.getCurrentModeType();
if(i != Configuration.UI_MODE_TYPE_CAR){
uim.enableCarMode(0);
}
uim.setNightMode(UiModeManager.MODE_NIGHT_YES);
退出夜间模式:
uim.disableCarMode(0);//这里可传两个参数,0:只退出夜间模式,1:退出应用程序和夜间模式。
这种方法是不可取的...首先2.2+要求太高,其次和CAR模式绑定让人很难hold,知道就好,说不定以后改善好了可以用...
第二种:调用其他apk文件的资源。
这个好处就是可以将夜间模式打包让需要的用户下载,和新浪微博是一个实现方式。将一个只有资源的project A 打包成apk,这个A就是所谓的夜间模式包,用户可以下载下来,重点在本身的project B怎么调用A的资源文件。实现如下:
//获得A的contex是关键。
Context mContext = createPackageContext("com.a", Context.CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY);
Resources mResource = mContext.getResources();
Integer identifer = getResources().getIdentifier("night_background", "drawable", "com.a");
BitmapDrawable db = (BitmapDrawable)mResource.getDrawable(identifer);
拿到bitmap就一切OK了...这个只是提供个思路,如果要做夜间模式,还是写一个比较完整的体系。
其实用反射也可以完成这个动作:顺便贴一下吧:
Class aR = mContext.getClassLoader().loadClass("com.a.R" + "$" + "drawable");
String filed = "night_background";
Field file = aR.getField(filed);
Integer bpd = (Integer)file.get(aR.newInstance());
拿到integer就如上述步骤了...