当前位置: 代码迷 >> Android >> Android-关于晚间模式
  详细解决方案

Android-关于晚间模式

热度:5   发布时间:2016-05-01 19:56:24.0
Android-关于夜间模式
最近再研究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就如上述步骤了...
  相关解决方案