jar引用的资源文件必须放在assets文件夹中,并且布局文件和Drawable必须是编译过的格式,否则布局文件无法解析,一般的Drawable尺寸不正确,Nine-Patch无法拉伸。

  抽取布局文件的方法如下,其中fileName必须包含assets/路径:

    public static View extractView(Context context, String fileName, ViewGroup root) throws Exception {
            XmlResourceParser parser = context.getAssets().openXmlResourceParser(fileName);
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            return inflater.inflate(parser, root);

    }

    注意,如果root为null,那么该布局文件的根元素属性会被忽略,比如固定的长和宽等,解决的一个办法是在外层再嵌套一个ViewGroup。

  抽取Drawable的方法是,其中fileName不必包含assets/路径:

    public static Drawable extractDrawable(Context context, String fileName) throws Exception {

      InputStream inputStream = context.getAssets().open(fileName);
      TypedValue value = new TypedValue();

      /** 传入TypeValue,指定资源的像素密度是基于320*480屏幕的 */
      value.density = 160; 

      /** 传入Resources,以获取目标屏幕像素密度 */ 

      Drawable drawable = Drawable.createFromResourceStream(context.getResources(), value, inputStream, fileName);
      inputStream.close();
      return drawable;
    }

  StateListDrawable添加状态时,enabled状态必须放在最后,值为false的状态只需取状态常量的相反数即可。

 

本帖最后由 维王 于 2012-4-6 16:08 编辑

Androidjar包封装及调用
        android开发过程中,我们经常会有这种需求,自己开发一个类库jar包,提供给别人调用。  即把项目A封装成jar包,供项目B调用,而在项目B中调用项目Aactivity的时候问题就出现了:找不到资源文件(异常:ERROR/AndroidRuntime(3341):Caused by: android.content.res.Resources$NotFoundException: Stringresource ID #0x7f060007)。问题是,只能共享src文件夹下的代码,而不能共享res资源文件,够郁闷! 创建一个Androidproject, eclipseexport导出,去掉AndroidManifest.xml,res 什么的,这样只共享了代码,而此代码中所调用的res资源文件却不能正常使用,否则会抛出res.Resources$NotFoundException异常。 那么如何解决呢?                   1.如果只用共享代码,而共享的代码中不涉及到res资源文件的调用的话,直接在Eclipse中导出jar包,在所需要的项目中引用即可。                   2.如果共享代码,而且共享的代码中涉及到res资源文件的调用,网上通用的方法是把res资源文件放到assets文件夹中,再在src代码中加载处理,然后再用eclipse导出jar包,引用即可( res资源虽然可以打进jar包,但当其他项目调用jar包时jar包中引用ID 指向的是当前项目的资源,关于如何让jar包中的资源引用只想jar包中的res文件暂无解决方案。我的问题已解决,解决方案:把图片资源放入assets包中一并打入jar包,布局就只能用代码了。jar包中代码可以成功引用jar包内的assets文件。 另:JNI层不可被打包入jar包,只能同jar包一同提供给第三方并放入工程目录下的libs包中 )。                   3.如果共享代码,而且涉及到res资源文件的调用,而且不想把res资源文件放到assets文件夹中的,直接生成jar包会出现的问题:                   1).当在别的项目中引用此jar包时,在项目名上出现小红叉,并且在console控制台上直接自动提示:Errorgenerating final archive: Found duplicate file for APK:res/drawable-hdpi/icon.png,通常的解决方法时,在能编译通过的此项目中直接去掉提示的资源文件,再生成jar包。                   2).把公共的icon等资源文件删除,生成jar包之后,此时在项目中引用,console控制台上无自动报错现象。如果jar包中的activity调用了res资源文件夹中的文件,在当前项目中调用jar包中的acticity时,问题就出现了,activity所引用的res资源,如果引用的是Strings.xml文件中的值,则抛出异常ERROR/AndroidRuntime(3341):Caused by: android.content.res.Resources$NotFoundException:Stringresource ID#0x7f060007。如果引用的是layout文件夹中的文件,能找到layout中的xml,例如layoutee.xml,可以找到R.layout.ee,但是在ee.xml中定义的控件id却引用不到,抛出异常ERROR/AndroidRuntime(13703):Caused by:java.lang.NullPointerException。如果在当前项目中调用不涉及jar包中的res的调用,一切OK                   4.如果共享代码,而且共享的代码中涉及到res资源文件的调用,如果封装成jar包,这种方法是达不到要求的(调用jar中封装的activity,还得保证jar包中activity正常调用jar中所封装的res资源,上面说了,jar包中的res资源部分调用为空),那么如何能满足需求呢? 把要生成jar包的项目做一下处理,在jar包项目的properties窗口中选择android的选项卡的isLibaray,点击apply按钮或者ok按钮(此时,jar包项目再点击右键选择runas →  AndroidApplication就能正常运行了)。在要引用jar包的项目中,右击项目名称,打开properties框口,选择android的选项卡的isLibaray右侧的Add按钮,添加jar包项目。这样jar包项目中的activity就能正常引用到jar包项目中的res资源了。项目调用jar包项目的activity就正常了。

更多相关文章

  1. 如何下载并编译Android(安卓)4.0内核源码Goldfish
  2. Android的/system/lib里加入自己的so库
  3. 【PaddlePaddle】测试Paddle-Lite mobile_light C++示例程序
  4. Android中Activity启动过程探究
  5. 输入包名生成android应用demo的实现
  6. Android(安卓)Camera 架构简析
  7. 【Android】Handler应用(二):从服务器端加载JSON数据的优化
  8. 电话权限确认
  9. Android(安卓)webView拦截url

随机推荐

  1. Android Gradle知识点总结
  2. 使用GoAgent更新Android SDK
  3. 基于Android Bionic 库动态编译busybox
  4. 八一八android与Linux的关系
  5. Android 播放gif
  6. 阿里巴巴Android开发手册
  7. Android Binder机制之 ServiceManager的
  8. 安卓航班Android开发经典教程大总结2----
  9. Android 手把手进阶自定义View(九)- 自动换
  10. android app的类响应式设计【半月谈投稿