包装安卓资源文件内分发的罐子的文件
-
22-09-2019 - |
题
我的工作有些重复使用安卓代码,我想要分发到其他开发商利用自己的应用程序。代码中有一些资源的依赖(布局,xml&png可绘),我希望能够包括并参考在一个软件包(罐子文件)。
这是可能的,并且如果那么,什么是最好的方法做到这一点?
解决方案
我没有给你任何乐观的消息。一般来说,你可以不容易,你会希望分发自己的包。主要问题是自动生成的R档。你可能对它做一些参考 - 你有你的布局和绘图。库的用户都会有自己的R档 - 包含IDS他的资源,而不是为你的库提供的。
在绘制资源的情况下,你可以在经典的方式阅读,无须R档。但据我所知,你是不是能够从充气外部XML文件的布局。
因此,丑陋的黑客在这里将你所有的资源,用户必须复制到自己的“资源”文件夹中的库一起分发。说实话,也没有很好的解决你的问题...对不起。 此致!
其他提示
由于让安卓 R
类自动用资源下的文件 /res
文件夹,用 R
类 final static
是不可能的。
我发现了一个很好的解决方案使用一个 jar
文件的 res
文件。这里是我怎么做:
在你的源代码,它将在出口
jar
文件, 不要用R
可变的,因为它将取代与一个最终的静态存储器的地址在编制时间。而不是使用R
, 我做我自己的方法如下:public static int getResourceIdByName(String packageName, String className, String name) { Class r = null; int id = 0; try { r = Class.forName(packageName + ".R"); Class[] classes = r.getClasses(); Class desireClass = null; for (int i = 0; i < classes.length; i++) { if (classes[i].getName().split("\\$")[1].equals(className)) { desireClass = classes[i]; break; } } if (desireClass != null) { id = desireClass.getField(name).getInt(desireClass); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } return id; }
例如,如果你有一个布局命名的
main.xml
, 你可以得到它通过调用的方法:int id = getResourceIdByName(context.getPackageName(), "layout", "main");
如果你有一串的
id
是"文本1",你可以得到它的叫法int id = getResourceIdByName(context.getPackageName(), "string", "text1");
这种方法让你有你的资源id在运行时间。它使用反射API得到的地位
R
在运行时间。通过使用这种方法可以避免使用
R
变量。复制你
res
文件的目标的项目。建立。
布局:
在Java源代码硬
的xml&PNG:
复制的xml&PNG到项目src文件夹和封装到罐子中,例如
复制a.png为src / COM /示例/测试
加载它如下的java代码:
InputStream is = YourClassName.class.getClassLoader().getResourceAsStream("com/example/test/a.png");
if ( null != is )
{
Bitmap bmp = BitmapFactory.decodeStream(is);
我刚发现,在Android SDK的aapt
工具允许下列选项:
--non-constant-id Make the resources ID non constant. This is required to make an R java class that does not contain the final value but is used to make reusable compiled libraries that need to access resources.
这声音有前途的,虽然我没有试过,所以我还没有线索,如果它的工作原理。我怀疑这是要解决要解决的问题通过@ J.J.Kim的岗位之上。
您可以动态地采用了android方法来获取资源ID。
int preferences = context.getResources().getIdentifier("preferences", "xml", context.getPackageName());
后来你的资源已经被列入(复制)到您的新项目。
我用 user558185 溶液但这里是一个更简单的方法。如果你的资源是在一个库项目(一科尔多瓦插件为例),你可以得到context.getResources().getIdentifier(name, className, context.getPackageName());
资源
此发生时,不正确生成的库项目资源R档和将R的packageName没有由库项目匹配所需的packageName。
在使用相同user558185的答案,但是它使用一个原生Android方法。
嗨,我认为这是一个迟到的反应,但仍然我怎么告知AAR
Android的归档 - 这个文件可以保存你的资源和清单文件,以便其他开发可以直接导入AAR他们的项目和编译他们的代码
这个方式,我们可能会得到清单合并错误,修复它使用在你的清单代替财产,这应该分配前进行检查。
可以使用抽象从实现类(用户)得到的R值。
protected abstract void getMyLayoutTextBox(int myLayoutTextBox);
然后,用户必须扩展类(其延伸Activity
),和实现此方法。在你的类,你只需要调用getMyLayoutTextBox()
他实现你分发的JAR后,你就会有用户提供正确的R值。
您可以阅读更多有关抽象这里。
如果您使用的是Eclipse,去项目"Properties->Java Build Path"
。在标签"Source"
,文件夹,你要打包添加资源的(例如RES / RAW)
这将添加以下行成.classpath
文件,点击
的
建设完成后,新的JAR文件将包含在res/raw/
文件夹中的文件。您可以访问他们的 user558185 建议。